<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/19">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/Python/1. Python 基础篇/1. Python 基础语法/1.2 Python 的安装/3. Pyhton 准备- ipython/">Python 准备-ipython</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Python/">Python</a>
			</span>
		
	</div>

	

	
		<h1 id="Python-准备-ipython"><a href="#Python-准备-ipython" class="headerlink" title="Python 准备-ipython"></a>Python 准备-ipython</h1><h2 id="update"><a href="#update" class="headerlink" title="update"></a>update</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;发现ipython notebook 灰常方便，主要是写一些代码片段的时候，debug起来甚至跟pycharm有的一拼。配置好服务器版本后，打开浏览器就能用，一定程度上提升了效率。具体如何配置ipython notebook的service可以看官网，值得注意的一点是，如果不配置直接本地运行的化，只能通过localhost:[port]打开，无法远程访问。</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装是没什么好说的，<code>yum install -y python-pip</code> 然后 <code>pip install ipython</code> 就完了，但是，很多时候我们要在不同的python版本间切换。比如自己习惯在python3版本下工作，但是很多时候学习一些书中的例子 时使用的是python2的版本。因此这里建议同时安装ipython和ipython3两个版本。从我自己使用的情况来看，同时安装两个版本的 ipython并没有冲突，两个版本间的安装包是相互独立的，只是两个版本的ipython会共享配置文件。需要使用python2的环境时就在终端执行 ipython，需要使用python3版本的时候就在终端执行ipython3。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">tianjun@tianjun-ASUS:~/.config/ipython$ ipython</div><div class="line">Python <span class="number">2.7</span><span class="number">.5</span>+ (default, Sep <span class="number">19</span> <span class="number">2013</span>, <span class="number">13</span>:<span class="number">48</span>:<span class="number">49</span>) </div><div class="line">Type <span class="string">"copyright"</span>, <span class="string">"credits"</span> <span class="keyword">or</span> <span class="string">"license"</span> <span class="keyword">for</span> more information.</div><div class="line">IPython <span class="number">1.1</span><span class="number">.0</span> -- An enhanced Interactive Python.</div><div class="line">? -&gt; Introduction and overview of IPython's features.</div><div class="line">%quickref -&gt; Quick reference.</div><div class="line">help -&gt; Python's own help system.</div><div class="line">object? -&gt; Details about 'object', use 'object??' for extra details.</div><div class="line"> In [<span class="number">1</span>]: exit</div><div class="line">tianjun@tianjun-ASUS:~/.config/ipython$ ipython3</div><div class="line">Python <span class="number">3.3</span><span class="number">.2</span>+ (default, Oct <span class="number">9</span> <span class="number">2013</span>, <span class="number">14</span>:<span class="number">50</span>:<span class="number">09</span>) </div><div class="line">Type <span class="string">"copyright"</span>, <span class="string">"credits"</span> <span class="keyword">or</span> <span class="string">"license"</span> <span class="keyword">for</span> more information.</div><div class="line"> IPython <span class="number">1.1</span><span class="number">.0</span> -- An enhanced Interactive Python.</div><div class="line">? -&gt; Introduction and overview of IPython's features.</div><div class="line">%quickref -&gt; Quick reference.</div><div class="line">help -&gt; Python's own help system.</div><div class="line">object? -&gt; Details about 'object', use 'object??' for extra details.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么怎么安装不同版本的ipython呢？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;谈到不同版本python的共存，一个不可避免的问题就是给不同的python版本安装对应的软件包。一个比较好的解决办法是先安装 virtualenv这个工具，然后生成一个独立的工作目录，在该目录下安装不同版本的工具包。但是我嫌这个每次都要切换到工作目录下，还要执行 activate，比较麻烦。所以建议分别安装pip和pip3工具。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y pip pip3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后想安装python2版本的软件包就用命令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">pip install ipython</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;想安装python3版本对应的软件包就用命令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">pip3 install ipython3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;类似的，我们可以安装好不同python版本对应的numpy，scipy,matplotlib,sklearn等等。</p>
<h2 id="常用功能"><a href="#常用功能" class="headerlink" title="常用功能"></a>常用功能</h2><h3 id="1-自动补全"><a href="#1-自动补全" class="headerlink" title="1. 自动补全"></a>1. 自动补全</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ipython最方便的第一个功能是tab自动补全。我常用来查看某个类的方法，或者是某个包中提供的函数。这个很是有用，有时候忘了某个函数是怎么写的时候，用自动补全查看下。例如：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%87%86%E5%A4%87-ipython/01.png?raw=true" alt="iamges"><figcaption class="figure__caption">iamges</figcaption></figure></p>
<h3 id="2-查看帮助文档和源码"><a href="#2-查看帮助文档和源码" class="headerlink" title="2. 查看帮助文档和源码"></a>2. 查看帮助文档和源码</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如，我想查看os.walk这个函数怎么用，可以在后面加上一个问号（os.walk？）再按enter。如果想查看更详细的源码实现，则加上两个问号，即（os.walk？？），这个功能经常用到，很是方便，有时候不知道某个参数代表什么意思的时候，就可以查看下帮助文档。</p>
<h3 id="3-把ipython当作终端用"><a href="#3-把ipython当作终端用" class="headerlink" title="3. 把ipython当作终端用"></a>3. 把ipython当作终端用</h3><p>在ipython中可以使用命令行中的许多命令，我常常用来切换目录，编辑或是删除文件。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%87%86%E5%A4%87-ipython/02.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外，还可以执行外部unix命令，不过需要在前面加入感叹号！，比如，需要编辑文件的时候，我就经常使用 !vim abc.py来运行vim程序。当然，也可以直接使用edit abc.py来编辑文件，该命令会自动启动vim，但我发现如果使用edit命令的话，编辑完保存文件并退出的时候ipython会自动运行该文件，这个h好处是可以接着在终端调用刚刚打开的文件中的变量和函数，不过这有时候会很烦人，所以我经常使用!vim abc.py来编辑文件。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ipython有许多个性化的设置，可以在命令行中输入 ipython profile create，这会在 ~/.config/ipython目录下生成配置文件，查看README有详细说明。</p>
<h3 id="4-书签"><a href="#4-书签" class="headerlink" title="4. 书签"></a>4. 书签</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有些工作目录可能经常使用，每次都cd很麻烦。所以，我们可以在第一次切换到该目录下后，使用bookmark 命令，以后直接一次cd即可，具体使用方法如下。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%87%86%E5%A4%87-ipython/03.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<h3 id="5-记录"><a href="#5-记录" class="headerlink" title="5. 记录"></a>5. 记录</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候我们希望将ipython中运行的命令保存到文件中，这时候可以使    用 logstart，logoff命令实现。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%87%86%E5%A4%87-ipython/04.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<h3 id="6-调试和运行"><a href="#6-调试和运行" class="headerlink" title="6. 调试和运行"></a>6. 调试和运行</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;run abc.py即可运行脚本，如果需要调试的时候，加入-d参数，即 run -d abc.py即可。需要注意的是，运行脚本后，变量即保存在此时的ipython运行环境中了，我们可以对脚本中的变量做进一步的分析和修改。关于调试， 最常使用的就是 s(step), n(next), c(continue),p(print)这4个命令。    </p>
<ul>
<li>l(list)命令用于显示上下文环境。例如：l 20 （显示当前行上下共20行代码） l 1, 30 （显示从1到第30行代码）    </li>
<li>break 用于设置断点。例如： break 10 （在第10行设置断点），break （查看断点信息），</li>
<li>condition 1 pression 给断点1设定条件pression, 这里pression是python表达式，当条件满足时在该点停下来</li>
<li>disable 1,(禁用断点1), enable 1, (恢复断点1), clear 1,(删除断点1), ignore 1 3,(在执行到断点1第四次时才启用该断点),</li>
<li>commands 1,(给断点1设定触发动作，每次运行到该断点时，执行设定的python表达式，比如用于观察某一变量的变化情况。输入end结束commands)<br>更高级的运用可以查看pdb的帮助文档。</li>
</ul>
<h3 id="7-其他"><a href="#7-其他" class="headerlink" title="7. 其他"></a>7. 其他</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其他比较有用的是pylab，在绘图时能够交互，从而使得修改绘图命令时，修改后的结果能够立即在图像上显示出来。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ipython notebook 感觉很鸡肋，平时很少用到。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Python/1. Python 基础篇/1. Python 基础语法/1.2 Python 的安装/2. Python 的安装/">Python 的安装</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Python/">Python</a>
			</span>
		
	</div>

	

	
		<h1 id="Python-的安装"><a href="#Python-的安装" class="headerlink" title="Python 的安装"></a>Python 的安装</h1><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<a href="https://www.python.org/" target="_blank" rel="external">python 官网</a></p>
<h2 id="1-linux-的-python-安装"><a href="#1-linux-的-python-安装" class="headerlink" title="1. linux 的 python 安装"></a>1. linux 的 python 安装</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CentOS 6.5 系统自带 Python 2.6 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># rpm -q python</span></div><div class="line">python-2.6.6-51.el6.x86_64</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CentOS 7.0 系统自带 PYthon 2.7</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># rpm -q python</span></div><div class="line">python-2.7.5-48.el7.x86_64</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 linux 系统下，直接输入 python 就可以进入 pyhton 的命令行模式，使用  <code>exit（）</code> 退出</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># python</span></div><div class="line">Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) </div><div class="line">[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2</div><div class="line">Type <span class="string">"help"</span>, <span class="string">"copyright"</span>, <span class="string">"credits"</span> or <span class="string">"license"</span> <span class="keyword">for</span> more information.</div><div class="line">&gt;&gt;&gt; <span class="built_in">print</span> <span class="string">'hello world'</span></div><div class="line">hello world</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;原生的 python 带的命令行不是很多，也不能使用 tab 键命令补齐。这时候需要安装一个 python shell 模块，叫 “ipython” 的模块，就可以进行命令补齐。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果计算机可以上网，那么可以直接使用网络安装，使用 命令 pip ，如果没有这个命令，需要先安装，需要先安装 epel 扩展源</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># yum install -y python-pip</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装完成后再安装 ipython</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># pip install ipython</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因为 CentOS 6.5 自带的 python 为 2.6 版本比较底，直接 pip 安装有可能高版本会报错，需要在包名后边加上低版本版本号，来安装较低版本。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># pip install ipython==1.2.1</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看安装模块命令 <code>pip list</code></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># pip list</span></div><div class="line">You are using pip version 7.1.0, however version 9.0.1 is available.</div><div class="line">You should consider upgrading via the <span class="string">'pip install --upgrade pip'</span> <span class="built_in">command</span>.</div><div class="line">argparse (1.2.1)</div><div class="line">distribute (0.6.10)</div><div class="line">iniparse (0.3.1)</div><div class="line">ipython (1.2.1)</div><div class="line">pip (7.1.0)</div><div class="line">pycurl (7.19.0)</div><div class="line">pygpgme (0.1)</div><div class="line">pyxdg (0.18)</div><div class="line">setuptools (0.6rc11)</div><div class="line">urlgrabber (3.9.1)</div><div class="line">yum-metadata-parser (1.1.2)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装完成，直接输入 ipython 就可以进如 python 命令行模式的，这个模式下可以使用 tab 键进行命令补齐了，退出使用命令 <code>exit</code> </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># ipython</span></div><div class="line">Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) </div><div class="line">Type <span class="string">"copyright"</span>, <span class="string">"credits"</span> or <span class="string">"license"</span> <span class="keyword">for</span> more information.</div><div class="line"></div><div class="line">IPython 1.2.1 -- An enhanced Interactive Python.</div><div class="line">? -&gt; Introduction and overview of IPython<span class="string">'s features.</span></div><div class="line"><span class="string">%quickref -&gt; Quick reference.</span></div><div class="line"><span class="string">help -&gt; Python'</span>s own <span class="built_in">help</span> system.</div><div class="line">object? -&gt; Details about <span class="string">'object'</span>, use <span class="string">'object??'</span> <span class="keyword">for</span> extra details.</div><div class="line"></div><div class="line">In [1]:</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装 ipython 报错</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/02.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用命令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># yum install -y python-devel</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果机器不能上网，那么需要在可以上网的机器上下载安装包拷贝到机器上安装。<a href="https://pypi.python.org/pypi/ipython" target="_blank" rel="external">下载地址</a><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后拷贝到机器解压</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/03.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解压以后有个 setup.py 脚本</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/04.png?raw=true" alt="iamges"><figcaption class="figure__caption">iamges</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用命令 setup.py install 安装，安装完成使用 <code>pip list</code> 查看是否安装成功。</p>
<h2 id="2-windows-安装-python-（只需要了解即可）"><a href="#2-windows-安装-python-（只需要了解即可）" class="headerlink" title="2.windows 安装 python （只需要了解即可）"></a>2.windows 安装 python （只需要了解即可）</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先在<a href="https://www.python.org/" target="_blank" rel="external">Python官网</a> 下载 python 安装包</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/05.png?raw=true" alt="iamges"><figcaption class="figure__caption">iamges</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下载安装以后，c 盘下会有一个 python 文件夹</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/06.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/07.png?raw=true" alt="iamges"><figcaption class="figure__caption">iamges</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后把 python 路径加入 windows 的环境变量</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/08.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/09.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/10.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/11.png?raw=true" alt="images"><figcaption class="figure__caption">images</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;进入 cmd 命令行模式，输入 python 就可以进入 python 命令行模式</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/python%E5%AE%89%E8%A3%85/12.png?raw=true" alt="iagmes"><figcaption class="figure__caption">iagmes</figcaption></figure></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Python/1. Python 基础篇/1. Python 基础语法/1.1 为什么学习 Python/1. 为什么要学 Python/">为什么要学 Python</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Python/">Python</a>
			</span>
		
	</div>

	

	
		<h1 id="为什么要学-Python"><a href="#为什么要学-Python" class="headerlink" title="为什么要学 Python"></a>为什么要学 Python</h1><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;现阶段，掌握一门开发语言已经成为高级运维工程师的必备计能，不会开发，你就不能充分理解你们系统的业务流程，你就不能帮助调试、优化开发人开发的程序，开发人员有的时候很少关注性能的问题，这些问题就得运维人员来做，一个业务上线了，导致CPU使用过高，内存占用过大，如果你不会开发，你可能只能查到进程级别，也就是哪个进程占用这么多，然后呢？然后就交给开发人员处理了，这样咋体现你的价值？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外，大一点的公司，服务器都上几百，上千，甚至数万台，这种情况下怎样做自动化运维？用Shell写脚本for循环？呵呵，歇了吧，Shell也就适合简单的系统管理工作。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;到复杂的自动化任务还得要用专门的开发语言。你可能说了，自动化管理有专门的开源软件监控也有，直接拿来用下就好了，但是现有的开源软件如Puppet、Saltstack、    OpenStack、Zabbix、Nagios 等多为通用的软件，不可能完全适用你公司的所有需求，当你需要做定制、做二次开发的时候，你咋办？找开发部门？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;开发部门不懂运维的实际业务逻辑，写出来的东西太烂不能用，我自己也做运维系统，6年运维工作经验，开发出来的第一版照样烂的不行，这还是懂的运维业务逻辑的，让开发人员来做，跑偏可能更多了，这就是为什么我见过很多公司自行开发运维平台，最后都扔那了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其次，不会运维开发，你就不能自己写运维平台复杂的运维工具，一切要借助于找一些开源软件拼拼凑凑，如果是这样，那就请不要抱怨你的工资低，你的工作不受重视了，话说人家FaceBook一个运维工程师管2万台机器，运维工程师年薪十几万USD，你以为人家是盖的呢？哪个不是身怀绝技，开发运维兼备？</p>
<h2 id="为什么要学Python？"><a href="#为什么要学Python？" class="headerlink" title="为什么要学Python？"></a>为什么要学Python？</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Python第一是个非常牛B的脚本语言，能满足绝大部分自动化运维的需求，又能做后端C/S架构，又能用WEB框架快速开发出高大上的Web界面，只有当你自已有能力做出一套运维自动化系统的时候，你的价值才体现出来，你才有资格跟老板谈重视，否则，还是老老实实回去装机器吧。</p>
<h2 id="运维开发为什么要用Python？"><a href="#运维开发为什么要用Python？" class="headerlink" title="运维开发为什么要用Python？"></a>运维开发为什么要用Python？</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Good question, 为什么不用PHP，JAVA， C++，RUBY，这里我只能说，见人见智， 如果你碰巧已经掌握了除Python之外的其它语言，那你爱用啥用啥，如果你是一个连SHELL都还没写明白的新手，想学个语言的话，请用Python，为什么呢？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先，PHP是跟Python比的最多的，其实他俩根本就不用比，为什么呢？两个语言适用性不同，PHP主要适用于Web开发，可以迅速的做出中小型，轻量级的WEB网站，但后端嘛，基本还是要借助其它语言，借助什么语言呢？Shell？Python？呵呵。而Python呢，是个综合语言，前后端都可以，单拿出来比Web，也一点不比PHP差，但为什么Web方向上    PHP比Python要火？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;先入为主嘛，PHP 90年代诞生就是做Web的，Python2000年后才出现Web框架，但论优秀程度上，Python的Web框架基本上出其无左，至少是跟PHP比。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那JAVA呢？好吧，一个臃肿、中庸、豪无新意的语言，还是老老实实用它来做ERP吧，搞个运维小平台，用JAVA真心没啥必要，在我看来，JAVA就是稳定的中年男人，稳定、成熟、秃顶，而Python代表的就是青春，简洁、快、干净、帅！<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C++/C，这个嘛，我只能说，如果你会了Python,又会C的话，那你会更吃香，但是不会C的话，其实也无大碍，基本上做运维的人，搞搞C就是为了来装B的，因为多数情况下你都到不了看系统底层源码的程度， 不过如果你学好了Python之后，还是建议你学习下    C++，毕竟相比Python这个动态语言来讲，C++的效率还是高很多的，但对新手来讲，不建议做为第一门语言开始学习，为什么呢？打击自信心…呵呵，你懂的<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Ruby，小日本开发的，还不错，风格跟Python有点像，因为Ruby onrails出了名，国外用的比较多，国内，放心吧，没戏，Python已经把它的想象空间都占死了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然还有新的语言GO，有些搞运维的看见做开发的人员搞GO，也想凑热闹，觉得是未来，我想说，别瞎没事跟风，GO再成功，也不会变成运维开发语言。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有些人觉得Python效率底，说他不能支持多线程，OH，好吧，这个还有点说对了，但是我想问，看我这篇文章的有几个做过搜索引擎开发？有几个做个上亿PV的并发网站开发？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有几个看过LINUX内核源码？如果没有，请别瞎跟着传了，知道PYTHON为什么不支持多线程吗？这句话问错了，其实Python支持多线程，只是不支持多CPU多线程，也就是一个程序spawn出来的多线程只能占用一个CPU，但是为什么呢？噢，因为GIL，GIL是什么东东，请自行补脑。。。但是你非得用多线程吗？你可以用多进程呀，再牛B你还可以用协程呀，这些Python支持的都很好呀，如果你的程序逻辑不好，搞个多线程也快不起来。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我认识一个博士讲过一句话，我觉得不错，他说，程序效率高低，80%都是写程序的人决定了，语言本身就占20%，所以下次有人再说PYTHON效率低的时候，请让他先回去自己检查下自己的程序多了多少无用的逻辑、循环等等。这个博士自己用Python写的WEB程序，一台服务器每天能处理上亿请求，一秒并发近两万，什么WEB框架这么牛B？　别问它是谁，它叫tornado。</p>
<h2 id="Python能否自学？"><a href="#Python能否自学？" class="headerlink" title="Python能否自学？"></a>Python能否自学？</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然可以，什么都可以自学，前提是你得能学得会，见过N多菜鸟踏上上自学的不归路，他妈的什么都能自学的话，还用大学干什么？自己在家鳖不就行了？<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;动不动就说Python是个脚本语言，自己看看就不会了，说这话的只可能有两种人，一种是高手，一种是SB，对于高手来讲，他肯定已经会其它语言，Python在这种情况下，自学当然就很容易学会，几年前我刚接触Python时，代码遇到问题，找了个开发的哥们帮调试，哥们帮调了十几分钟就搞定了，结果人家以前一句Python代码也没写过，为什    么，因为语言都有相通之处，一门掌握好了，其它门自己学学就会了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但对于新手来讲，没任何语言基础就开始自学，那么恭喜你，菜鸟们见此文章为证，从今天开始自学，一年后，你要是能自己做出个软件来，来找我要一千块钱。哈哈，真的。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;基本上自学是属于专业人员干的事情，就像会一门乐器了，自己学下就可能学会另一门，但我之前没音乐基础，跟着老师都没把吉它学会。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所以奉劝没基础又想学Python的同学，花点钱去报个班学吧，拿钱换时间，时间是生命，钱没了可再挣钱，时间过去了就再也不会回来，如果你不信邪，非要自己学，那我    佩服你的勇气，不过自己试试就知道了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然天下没有绝对的事情，我大天朝牛X的人多了去了，很多人也能过自学编程，最后变成高手了，我的Python也是自学的，但是我可以说自学过程中走过了N多坑好么，好多时候纠结在一个简单的小问题上好几天都卡住，当时如果不是因为工作需求，估计早放弃了，这还是Python，就别说其它复杂的语言了，我相信除了少数的大牛之外，多数    人不比我聪明到哪去，选择自学的同鞋们，一路珍重。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说了这么多，只想告诉那些迷茫不知所措该学什么语言的新手们，　在你还没学好走路的时候，不要老想着，将来我当上老板了，我是开宝马呢？还是开奔驰呢？先学会骑自行车吧！</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Puppet/3. Puppet cron/">Puppet cron</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Puppet/">Puppet</a>
			</span>
		
	</div>

	

	
		<h2 id="cron"><a href="#cron" class="headerlink" title="cron"></a>cron</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装和管理crontab任务</p>
<h2 id="平台"><a href="#平台" class="headerlink" title="平台"></a>平台</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;支持所有有crontab的平台</p>
<h2 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">cron &#123; logrotate:</div><div class="line">    <span class="built_in">command</span> =&gt; <span class="string">"/usr/sbin/logrotate"</span>,</div><div class="line">    user =&gt; root,</div><div class="line">    hour =&gt; 2,</div><div class="line">    minute =&gt; 0</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意,所有的cron值可以用数组表示,例如</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">cron &#123; logrotate:</div><div class="line">    <span class="built_in">command</span> =&gt; <span class="string">"/usr/sbin/logrotate"</span>,</div><div class="line">    user =&gt; root,</div><div class="line">    hour =&gt; [2, 4]</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;或者使用范围,或者 */2 这样的语法,</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">cron &#123; logrotate:</div><div class="line">    <span class="built_in">command</span> =&gt; <span class="string">"/usr/sbin/logrotate"</span>,</div><div class="line">    user =&gt; root,</div><div class="line">    hour =&gt; [<span class="string">'2-4'</span>],</div><div class="line">    minute =&gt; <span class="string">'*/10'</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了用户和command两个参数以外,其他的参数都是可选项.</p>
<h3 id="command"><a href="#command" class="headerlink" title="command"></a>command</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;crontab要执行的命令, 环境变量按照系统本地规则进行管理,推荐使用绝对路径.</p>
<h3 id="ensure"><a href="#ensure" class="headerlink" title="ensure"></a>ensure</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定该资源是否启用,可设置成true或absent</p>
<h3 id="environment"><a href="#environment" class="headerlink" title="environment"></a>environment</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 crontab环境里面指定环境变量,例如 PATH=/bin:/usr/bin:/usr/sbin.</p>
<h3 id="hour"><a href="#hour" class="headerlink" title="hour"></a>hour</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;运行crontab的小时,可设置成0-23</p>
<h3 id="minute"><a href="#minute" class="headerlink" title="minute"></a>minute</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;运行crontab的分钟,可设置成0-59</p>
<h3 id="month"><a href="#month" class="headerlink" title="month"></a>month</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置crontab运行的月份,1-12</p>
<h3 id="monthday"><a href="#monthday" class="headerlink" title="monthday"></a>monthday</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个月份中的日子,1-31</p>
<h3 id="name"><a href="#name" class="headerlink" title="name"></a>name</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该crontab的名字,这个名字用于管理员区分不同的crontab,以及puppet管理各种资源关系.</p>
<h3 id="provider"><a href="#provider" class="headerlink" title="provider"></a>provider</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定provider,可用的provider有</p>
<ul>
<li>crontab 默认的crontab程序</li>
<li>special 特殊的管理程序,只能在freebsd上面用</li>
</ul>
<h3 id="user"><a href="#user" class="headerlink" title="user"></a>user</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把该crontab加到那个用户的crontab列表,默认是运行puppet的用户</p>
<h3 id="weekday"><a href="#weekday" class="headerlink" title="weekday"></a>weekday</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;运行crontab的星期数,0-7</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Puppet/4. Puppet exec/">Puppet exec</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Puppet/">Puppet</a>
			</span>
		
	</div>

	

	
		<h2 id="exec"><a href="#exec" class="headerlink" title="exec"></a>exec</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;让puppet执行外部命令</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;多次反复用这个方式执行命令是有威胁性的,因此建议对执行的命令进行加锁或者类似的处理. 你也可以让exec只有在收到一个其他资源的事件的时候才执行. 因为exec资源是一种挥发性资源,命令执行完了,这个资源可以说就处理完了. 因此在不同的类里面,exec资源的名字可以是相同的,这是exec资源特殊的地方.例如下面的例子;</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># defined in the production class</span></div><div class="line"><span class="built_in">exec</span> &#123; <span class="string">"make"</span>:</div><div class="line">    cwd =&gt; <span class="string">"/prod/build/dir"</span>,</div><div class="line">    path =&gt; <span class="string">"/usr/bin:/usr/sbin:/bin"</span></div><div class="line">&#125;</div><div class="line"></div><div class="line">. etc. .</div><div class="line"></div><div class="line"><span class="comment"># defined in the test class</span></div><div class="line"><span class="built_in">exec</span> &#123; <span class="string">"make"</span>:</div><div class="line">    cwd =&gt; <span class="string">"/test/build/dir"</span>,</div><div class="line">    path =&gt; <span class="string">"/usr/bin:/usr/sbin:/bin"</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在不同的类定义相同名字的exec资源,如果是其他类型的资源,将会在执行puppet的时候得到一个错误,但是在exec资源里面,这却是正确的.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不过为了方便 起见,建议每个exec资源的名字最好是唯一的.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意,如果一个exec资源从别的资源收到一个事件,exec资源将会再一次的执行.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;利用exec资源可以做到puppet不能做到的事情. 这是对puppet一个强有力的扩展.</p>
<h2 id="要求"><a href="#要求" class="headerlink" title="要求"></a>要求</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;无附加要求。</p>
<h2 id="平台"><a href="#平台" class="headerlink" title="平台"></a>平台</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所有平台。</p>
<h2 id="版本兼容性"><a href="#版本兼容性" class="headerlink" title="版本兼容性"></a>版本兼容性</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这一部分还未完成。</p>
<h2 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h2><h3 id="command"><a href="#command" class="headerlink" title="command"></a>command</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将会被执行的命令，必须为被执行命令的绝对路径，或者得提供该命令的搜索路径。如果命令被成功执行，所有的输出会被记录在实例的正常（normal）日志里，但是如果命令执行失败（既返回值与我们所指定的不同），那么所有的输出会在错误（err）日志中被记录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个是exec资源类型的名变量（namevar）。</p>
<h3 id="creates"><a href="#creates" class="headerlink" title="creates"></a>creates</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定命令所生成的文件。如果提供了这个参数，那么命令只会在所指定的文件不存在的情况的被执行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">exec</span> &#123; <span class="string">"tar xf /my/tar/file.tar"</span>:</div><div class="line">    cwd =&gt; <span class="string">"/var/tmp"</span>,</div><div class="line">    creates =&gt; <span class="string">"/var/tmp/myfile"</span>,</div><div class="line">    path =&gt; [<span class="string">"/usr/bin"</span>, <span class="string">"/usr/sbin"</span>]</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="cwd"><a href="#cwd" class="headerlink" title="cwd"></a>cwd</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定命令执行的目录。如果目录不存在，则命令执行失败。</p>
<h3 id="env"><a href="#env" class="headerlink" title="env"></a>env</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我们不建议使用这个参数，请使用‘environment’。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这一部分还未完成。</p>
<h3 id="environment"><a href="#environment" class="headerlink" title="environment"></a>environment</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为命令设定额外的环境变量。要注意的是如果你用这个来设定PATH，那么PATH的属性会被覆盖。多个环境变量应该以数组的形式来设定。</p>
<h3 id="group"><a href="#group" class="headerlink" title="group"></a>group</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;定义运行命令的用户组。在不同的平台下的运行的结果无法确定，由于不同用户运行命令的时候，变量是不变的，所以这是平台的问题，而不是Ruby或Puppet的问题。</p>
<h3 id="logoutput"><a href="#logoutput" class="headerlink" title="logoutput"></a>logoutput</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否记录输出。默认会根据exec资源的日志等级（loglevel） 来记录输出。若定义为on_failure，则仅在命令返回错误的时候记录输出。可取的值为：true，false和其他合法的日志等级。</p>
<h3 id="onlyif"><a href="#onlyif" class="headerlink" title="onlyif"></a>onlyif</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果这个参数被设定了，则exec只会在onlyif设定的命令返回0时才执行。例如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">exec</span> &#123; <span class="string">"logrotate"</span>:</div><div class="line">    path =&gt; <span class="string">"/usr/bin:/usr/sbin:/bin"</span>,</div><div class="line">    onlyif =&gt; <span class="string">"test `du /var/log/messages | cut -f1` -gt 100000"</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;只有在test返回true的时候logrotate才会被运行。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需要注意的是onlyif定义的命令跟主命令遵循同样的规则，也就是说如果path没有被设置的话，需要使用绝对路径。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除此之外，onlyif还可以接受数组做为其值，例如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">onlyif =&gt; [<span class="string">"test -f /tmp/file1"</span>, <span class="string">"test -f /tmp/file2"</span>]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面的代码限定了只有在所有数组中的条件返回true时exec才会被执行。</p>
<h3 id="path"><a href="#path" class="headerlink" title="path"></a>path</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;命令执行的搜索路径。如果path没有被定义，命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。</p>
<h3 id="refresh"><a href="#refresh" class="headerlink" title="refresh"></a>refresh</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;定义如何更新命令。当exec收到一个来自其他资源的事件时，默认只会重新执行一次命令。不过这个参数允许你定义更新时执行不同的命令。</p>
<h3 id="refreshonly"><a href="#refreshonly" class="headerlink" title="refreshonly"></a>refreshonly</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该属性可以使命令变成仅刷新触发的，也就是说只有在一个依赖的对象被改变时，命令才会被执行。仅当命令与其他对象有依赖关系时，这个参数才有意义。当你要触发某个行为时，会显得很有用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Pull down the main aliases file</span></div><div class="line">file &#123; <span class="string">"/etc/aliases"</span>:</div><div class="line">    <span class="built_in">source</span> =&gt; <span class="string">"puppet://server/module/aliases"</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment"># Rebuild the database, but only when the file changes</span></div><div class="line"><span class="built_in">exec</span> &#123; newaliases:</div><div class="line">    path =&gt; [<span class="string">"/usr/bin"</span>, <span class="string">"/usr/sbin"</span>],</div><div class="line">    subscribe =&gt; File[<span class="string">"/etc/aliases"</span>],</div><div class="line">    refreshonly =&gt; <span class="literal">true</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要注意的是只有subscribe和notify可以促发行为，而不是require，所以在使用 refreshonly时，只有同时使用subscribe或notify才有意义。有效的值为true, false。</p>
<h3 id="returns"><a href="#returns" class="headerlink" title="returns"></a>returns</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定返回的代码。如果被执行的命令返回了其他的代码，一个错误（error）会被返回。默认值是0，可以定义为一个由可以接受的返回代码组成的数组或单值。</p>
<h3 id="timeout"><a href="#timeout" class="headerlink" title="timeout"></a>timeout</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;命令运行的最长时间。如果命令运行的时间超过了timeout定义的时间，那么这个命令就会被终止，并作为运行失败处理。当定义为负值时就会取消运行时间的限制。timeout的值是以秒为单位的。</p>
<h3 id="unless"><a href="#unless" class="headerlink" title="unless"></a>unless</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果这个变量被指定了，那么exec会执行，除非unless所设定的命令返回0。例如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">exec</span> &#123; <span class="string">"/bin/echo root &gt;&gt; /usr/lib/cron/cron.allow"</span>:</div><div class="line">    path =&gt; <span class="string">"/usr/bin:/usr/sbin:/bin"</span>,</div><div class="line">    unless =&gt; <span class="string">"grep root /usr/lib/cron/cron.allow 2&gt;/dev/null"</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面这段代码先用grep在cron.allow文件（Solaris系统中）中找root，如果没有找到，就写入root。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要注意的是这个参数里的命令跟主命令遵循同样的规则，也就是说如果path没有被设置的话，需要使用绝对路径。</p>
<h3 id="user"><a href="#user" class="headerlink" title="user"></a>user</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;定义运行命令的用户。 注意如果你使用了这个参数，那么任何的错误输出不会在当下被捕捉，这是Ruby的一个bug。 If you are using Puppet to create this user, the exec will automatically require the user, as long as it is specified by name.</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Puppet/2. Puppet学习之文件管理/">Puppet学习之文件管理</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Puppet/">Puppet</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用puppet可以方便的进行文件管理，可以对文件的内容、属组、属主、权限等进行管理。可管理的文件类型包括普通文件、目录、链接文件。类型需要在ensure类型中明确指定。接下来从三个方面来介绍puppet文件管理的操作。</p>
<h2 id="一、Puppet服务器端的配置"><a href="#一、Puppet服务器端的配置" class="headerlink" title="一、Puppet服务器端的配置"></a>一、Puppet服务器端的配置</h2><ol>
<li>fileserver.conf文件的配置</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vim fileserver.conf 添加如下内容，在puppet master上创建一个文件存放目录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[files]</div><div class="line">path /etc/puppet/files</div><div class="line">allow 10.1.4.0/24</div></pre></td></tr></table></figure>
<ol>
<li>site.pp文件的配置</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最好是更改其他的文件，然后用这个文件import进来，我这里为了测试简便就直接更改这个文件了，具体的如何操作见后面的实战部分。</p>
<h2 id="二、Puppet文件管理重要参数介绍"><a href="#二、Puppet文件管理重要参数介绍" class="headerlink" title="二、Puppet文件管理重要参数介绍"></a>二、Puppet文件管理重要参数介绍</h2><ol>
<li>backup参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定在文件内容替换之前进行备份操作，可以备份在本地，也可以集中备份。集中远程备份的话可以使用filebucket（我们在后面的实战部分会进行详细介绍），这个备份的时候如果备份在本地可以指定备份的文件名。</p>
<ol>
<li>content参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定文件的内容(字符串)，这个参数和source、target参数冲突。</p>
<ol>
<li>ensure参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数指定是否创建、删除文件或者目录，有present、absent、file、directory等值。其中present会检查文件是否存在，不存在就会创建一个空文件。absent会删除文件或者目录，如果是目录需要指定recurse参数指定是否允许递归。如果指定的是其他的参数，则会创建连接文件，为了方便管理，建议在创建的时候使用ensure =&gt; link,并通过target参数指定文件。注意不能在windows系统上链接文件，</p>
<ol>
<li>force参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该参数强制执行文件操作，进行如下操作的时候必须指定force参数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;purge 子目录</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用文件或者链接文件替换目录</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用ensure =&gt; absent参数删除目录</p>
<ol>
<li>group参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定文件或者目录的属组，可以是组名或者组id，如果是windows的话属组和属主不能相同。</p>
<ol>
<li>ignore参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数指定在递归期间对符合指定的模式的文件操作将被忽略。</p>
<ol>
<li>links参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数指定处理文件期间如何处理链接文件，可以设置follow和manage。在拷贝文件的时候，follow将会拷贝目标文件代替链接文件，manage将只会拷贝链接文件，ignore将会跳过。</p>
<ol>
<li>mode参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数用来指定文件或者目录的权限，puppet使用传统的unix权限方案，如果系统采用的权限方案不同的，puppet为这些系统将权限翻译成等价的权限，比如windows。这些权限可以是数字(r=4,w=2,x=1)也可以是字符(rwxst)。</p>
<ol>
<li>owner参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定文件的属主，可以是用户名或是用户id，如果是windows的话属组和属主不能相同。</p>
<ol>
<li>path参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定文件管理的路径。Windows路径也使用/而不是\。</p>
<ol>
<li>purge参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数会删除在master上不存在的文件，这个参数只有在管理目录的时候指定了recurse =&gt; true参数的时候才有意义。</p>
<ol>
<li>recurse参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数指定是否进行递归调用以及递归调用的深度，选项如下</p>
<ul>
<li>inf,true  —在远程和本地都进行递归调用</li>
<li>remote —只在远程进行递归调用</li>
<li>false —不进行递归调用</li>
<li>[0-9]+ —和true参数一样，但是限制递归调用目录的深度</li>
</ul>
<ol>
<li>source参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该参数指定将会被拷贝到指定位置的资源文件，值可以是指定远程文件的URIS或者本地的完整路径。可以指定多个sorce，这个参数和content、target冲突。</p>
<ol>
<li>target参数</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数指定创建链接文件的目标文件或者目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面只是列了一些常用的选项，更多选项请参考：</p>
<p><a href="https://docs.puppet.com/puppet/latest/type.html#augeas-attributes" target="_blank" rel="external">https://docs.puppet.com/puppet/latest/type.html#augeas-attributes</a></p>
<h3 id="三、Puppet文件管理实战"><a href="#三、Puppet文件管理实战" class="headerlink" title="三、Puppet文件管理实战"></a>三、Puppet文件管理实战</h3><ol>
<li>使用filebucket进行远程备份。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Filebucket的配置</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim site.pp</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#添加filebucket的配置</span></div><div class="line">filebucket &#123; <span class="string">'main'</span>:</div><div class="line">    server =&gt; <span class="string">"puppet.zhang.com"</span>,</div><div class="line">    path =&gt; <span class="literal">false</span>,</div><div class="line">&#125;</div><div class="line"><span class="comment">#让节点node1.zhang.com进行远程备份</span></div><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123; <span class="string">"/etc/test2"</span>:</div><div class="line">    <span class="built_in">source</span> =&gt; <span class="string">"puppet://puppet.zhang.com/files/test2"</span>,</div><div class="line">    backup =&gt; main</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果没有设置bucketdir路径，那么默认文件保存在master的$vardir/bucket路径。存储是以文件的md5值为目录，目录下面存储了文件的路径和内容，因此获取备份文件的内容和恢复都需要使用到文件的md5值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在agent通过filebucket客户端获取文件的内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">puppet filebucket get 4894b816078bcca4b63a6feaaf38aff8</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在agent通过filebucket客户端还原文件的内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">puppet filebucket restore /etc/test2 4894b816078bcca4b63a6feaaf38aff8</div></pre></td></tr></table></figure>
<ol>
<li>将master上文件目录下的一个文件，复制到agent的指定位置，如果文件存在就先对文件进行备份然后覆盖。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置代码如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">         file &#123;<span class="string">"/etc/test1"</span>:</div><div class="line">         <span class="built_in">source</span> =&gt; <span class="string">"puppet://puppet.zhang.com/files/test1"</span>,</div><div class="line">         backup =&gt; <span class="string">".bak_<span class="variable">$uptime_seconds</span>"</span>,</div><div class="line">&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>将 agent 上的一个文件复制成另外一个文件，如果目的文件存在就先做备份再覆盖，并制定文件属master和权限。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置代码如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">        file &#123;<span class="string">"/tmp/test2"</span>:</div><div class="line">        <span class="built_in">source</span> =&gt; <span class="string">"/etc/passwd"</span>,</div><div class="line">        backup =&gt; <span class="string">".bak_<span class="variable">$uptime_seconds</span>"</span>,</div><div class="line">        group =&gt; nobody,</div><div class="line">        owner =&gt; nobody,</div><div class="line">        mode =&gt; 600;</div><div class="line">&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>在agent上创建/tmp/test3，并制定文件的内容为test3。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置代码如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">        file &#123;<span class="string">"/tmp/test3"</span>:</div><div class="line">        content =&gt; <span class="string">"test3"</span>&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>对agent上的某个文件或者文件夹建立软连接。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;<span class="string">"/tmp/test4"</span>:</div><div class="line">        ensure =&gt; link,</div><div class="line">        target =&gt; <span class="string">"/var/log/messages"</span>;</div><div class="line">        <span class="string">"/tmp/test5"</span>:</div><div class="line">        ensure =&gt; link,</div><div class="line">        target =&gt; <span class="string">"/var/log"</span>;</div><div class="line">        &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以简写成如下代码：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;<span class="string">"/tmp/test4"</span>:</div><div class="line">        ensure =&gt; <span class="string">"/var/log/messages"</span>;</div><div class="line">        <span class="string">"/tmp/test5"</span>:</div><div class="line">        ensure =&gt; <span class="string">"/var/log"</span>;</div><div class="line">        &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>如果agent上/tmp/test6文件存在的话就删除掉agent上的/tmp/test6文件。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;<span class="string">"/tmp/test6"</span>:</div><div class="line">        ensure =&gt; absent;</div><div class="line">        &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>如果agent上不存在/tmp/test7文件就在agent上创建/tmp/test6文件。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;<span class="string">"/tmp/test7"</span>:</div><div class="line">        ensure =&gt; present;</div><div class="line">        &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>在agent上创建目录。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;</div><div class="line">      <span class="string">"/tmp/test8"</span>:</div><div class="line">      ensure =&gt; directory;</div><div class="line">      &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>删除agent上面的目录。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123; <span class="string">"/tmp/test9/"</span>:</div><div class="line">       ensure =&gt; absent,</div><div class="line">       force =&gt; <span class="literal">true</span>;</div><div class="line">       &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<ol>
<li>类似rsync，将master上面的文件目录同步到agent上，不同步含有log的文件和目录，如果含有子目录，递归到子目录，删除master上没有agent上有的文件或者目录。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">node <span class="string">'node1.zhang.com'</span>&#123;</div><div class="line">file &#123;<span class="string">"/tmp/test10"</span>:</div><div class="line">        ensure =&gt; directory,</div><div class="line">        <span class="built_in">source</span> =&gt; <span class="string">"puppet://puppet.zhang.com/files/"</span>,</div><div class="line">        ignore =&gt; <span class="string">'*log*'</span>,</div><div class="line">        recurse =&gt; <span class="literal">true</span>,</div><div class="line">        purge =&gt; <span class="literal">true</span>,</div><div class="line">        force =&gt; <span class="literal">true</span>,</div><div class="line">     &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="四、参考文档"><a href="#四、参考文档" class="headerlink" title="四、参考文档"></a>四、参考文档</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<a href="http://docs.puppetlabs.com/references/stable/configuration.html" target="_blank" rel="external">http://docs.puppetlabs.com/references/stable/configuration.html</a></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Puppet/1. Puppet安装和配置/">Puppet安装和配置</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Puppet/">Puppet</a>
			</span>
		
	</div>

	

	
		<h2 id="一、准备工作"><a href="#一、准备工作" class="headerlink" title="一、准备工作"></a>一、准备工作</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;两台机器：192.168.0.93（服务端）  192.168.0.92 （客户端）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;两台机器关闭selinux，清空iptables规则，并保存，设置hostname</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;192.168.0.93 上 hostname web9.yanyi.com </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑 /etc/sysconfig/network  定义hostname</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/sysconfig/network</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/01.png?raw=true" alt="01"><figcaption class="figure__caption">01</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;192.168.0.92 上 hostname web10.yanyi.com</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑 /etc/sysconfig/network  定义hostname</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># vim /etc/sysconfig/network</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/02.png?raw=true" alt="02"><figcaption class="figure__caption">02</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑hosts文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/hosts</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># vim /etc/hosts</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;192.168.0.93 和 192.168.0.92全部为</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/03.png?raw=true" alt="03"><figcaption class="figure__caption">03</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;两台机器安装ntpdate，并建立自动同步时间的任务计划：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># yum install -y ntp</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># yum install -y ntp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;crontab -e #加入</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># crontab -e</span></div><div class="line">*/10 * * * * ntpdate time.windows.com &gt;/dev/null 2&gt;&amp;1</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># crontab -e</span></div><div class="line">*/10 * * * * ntpdate time.windows.com &gt;/dev/null 2&gt;&amp;1</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/04.png?raw=true" alt="04"><figcaption class="figure__caption">04</figcaption></figure></p>
<h2 id="二、安装-puppet"><a href="#二、安装-puppet" class="headerlink" title="二、安装 puppet"></a>二、安装 puppet</h2><h3 id="1-安装服务端"><a href="#1-安装服务端" class="headerlink" title="1.安装服务端"></a>1.安装服务端</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端（192.138.0.93）上</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装puppet 源</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装服务端程序</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># yum install -y puppet-server</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;启动服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># service puppetmaster start</span></div><div class="line">启动 puppetmaster： [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;开机启动</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># chkconfig puppetmaster on</span></div></pre></td></tr></table></figure>
<h3 id="2-安装客户端"><a href="#2-安装客户端" class="headerlink" title="2.安装客户端"></a>2.安装客户端</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端（192.168.0.92）上</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装puppet 源</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装客户端程序</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># yum install -y puppet</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改配置文件  /etc/puppet/puppet.conf 在最后面添加</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">server = web9.yanyi.com</div><div class="line"> runinterval = 10</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># vim /etc/puppet/puppet.conf</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/05.png?raw=true" alt="05"><figcaption class="figure__caption">05</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;启动服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># service puppet start</span></div><div class="line">Starting puppet agent:         [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;开机启动</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># chkconfig puppet on</span></div></pre></td></tr></table></figure>
<h2 id="三、配置认证"><a href="#三、配置认证" class="headerlink" title="三、配置认证"></a>三、配置认证</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端查看客户端证书列表 puppet cert list –all #如果签发的证书，会本行最前面带一个+</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all</span></div><div class="line"> <span class="string">"web10.yanyi.com"</span> (SHA256) 16:BF:29:D2:D3:56:18:25:CE:8E:E3:89:E7:6E:08:65:BB:BC:F7:1F:98:86:0D:DA:C8:48:B8:60:75:A8:77:94</div><div class="line">+ <span class="string">"web9.yanyi.com"</span> (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: <span class="string">"DNS:puppet"</span>, <span class="string">"DNS:puppet.yanyi.com"</span>, <span class="string">"DNS:web9.yanyi.com"</span>)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端上生成ssl证书 puppet agent –test  –server web9.yanyi.com</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet agent --test --server web9.yanyi.com</span></div><div class="line">Warning: Unable to fetch my node definition, but the agent run will <span class="built_in">continue</span>:</div><div class="line">Warning: undefined method `include?<span class="string">' for nil:NilClass</span></div><div class="line"><span class="string">Info: Retrieving pluginfacts</span></div><div class="line"><span class="string">Info: Retrieving plugin</span></div><div class="line"><span class="string">Info: Caching catalog for web9.yanyi.com</span></div><div class="line"><span class="string">Info: Applying configuration version '</span>1487260353<span class="string">'</span></div><div class="line"><span class="string">Info: Creating state file /var/lib/puppet/state/state.yaml</span></div><div class="line"><span class="string">Notice: Finished catalog run in 0.01 seconds</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端签发指定客户端证书</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert --sign web10.yanyi.com</span></div><div class="line">Notice: Signed certificate request <span class="keyword">for</span> web10.yanyi.com</div><div class="line">Notice: Removing file Puppet::SSL::CertificateRequest web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/requests/web10.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;执行 puppet cert list –all 看是否成功</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line">+ <span class="string">"web10.yanyi.com"</span> (SHA256) 50:B7:39:53:62:3C:BA:AF:BD:7B:B3:48:99:B7:3D:B2:9D:DE:5E:34:71:FD:3A:2B:8A:34:98:09:2C:02:6F:87</div><div class="line">+ <span class="string">"web9.yanyi.com"</span> (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: <span class="string">"DNS:puppet"</span>, <span class="string">"DNS:puppet.yanyi.com"</span>, <span class="string">"DNS:web9.yanyi.com"</span>)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端可以删除指定客户端证书</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert clean web10.yanyi.com</span></div><div class="line">Notice: Revoked certificate with serial 3</div><div class="line">Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/signed/web10.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/certs/web10.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line">+ <span class="string">"web9.yanyi.com"</span> (SHA256) F6:E5:87:3B:AF:F1:A0:37:D9:5E:05:B1:19:FB:49:C7:AE:EC:DD:B6:4F:F5:11:BE:70:18:3D:46:A8:FE:E5:A0 (alt names: <span class="string">"DNS:puppet"</span>, <span class="string">"DNS:puppet.yanyi.com"</span>, <span class="string">"DNS:web9.yanyi.com"</span>)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除所有证书 puppet cert clean –all</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert clean --all</span></div><div class="line">Notice: Revoked certificate with serial 2</div><div class="line">Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/signed/web9.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/certs/web9.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Key web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/private_keys/web9.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除所有证书以后，服务端执行 puppet agent –test  –server web9.yanyi.com</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet agent --test --server web9.yanyi.com </span></div><div class="line">Info: Creating a new SSL key <span class="keyword">for</span> web9.yanyi.com</div><div class="line">Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml</div><div class="line">Info: Creating a new SSL certificate request <span class="keyword">for</span> web9.yanyi.com</div><div class="line">Info: Certificate Request fingerprint (SHA256): AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3</div><div class="line">Exiting; no certificate found and waitforcert is disabled</div><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line"> <span class="string">"web9.yanyi.com"</span> (SHA256) AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端需删除 ssl 目录下所有文件并重启服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># rm -rf /var/lib/puppet/ssl/*</span></div><div class="line">[root@web10 ~]<span class="comment"># service puppet restart</span></div><div class="line">Stopping puppet agent: [确定]</div><div class="line">Starting puppet agent: [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后服务端查看，并重签</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line"> <span class="string">"web10.yanyi.com"</span> (SHA256) 58:48:87:28:06:26:CA:53:86:31:A0:78:B7:55:E5:F7:6E:C2:3E:5E:19:48:19:C3:96:E9:42:9F:D9:96:13:EC</div><div class="line"> <span class="string">"web9.yanyi.com"</span> (SHA256) AF:C5:3E:47:E7:6F:38:11:C5:F9:04:EB:05:8D:81:A1:FF:4E:8F:89:0B:28:38:A2:79:8F:B2:1A:D2:D5:26:A3</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert --sign web9.yanyi.com</span></div><div class="line">Notice: Signed certificate request <span class="keyword">for</span> web9.yanyi.com</div><div class="line">Notice: Removing file Puppet::SSL::CertificateRequest web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/requests/web9.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert --sign web10.yanyi.com</span></div><div class="line">Notice: Signed certificate request <span class="keyword">for</span> web10.yanyi.com</div><div class="line">Notice: Removing file Puppet::SSL::CertificateRequest web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/requests/web10.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line">+ <span class="string">"web10.yanyi.com"</span> (SHA256) B0:2C:B1:C4:B7:E3:3E:1A:40:99:D2:4F:6F:E3:1E:1E:24:69:22:07:68:D9:C9:F4:9E:5F:4A:D9:BF:35:F6:27</div><div class="line">+ <span class="string">"web9.yanyi.com"</span> (SHA256) D0:49:21:D3:4E:B6:EA:48:19:4D:29:F4:4C:A1:16:77:BC:DD:8E:BA:73:6C:83:0A:37:5F:5D:F8:0B:67:B1:B7</div></pre></td></tr></table></figure>
<h2 id="四、-配置自动签发证书"><a href="#四、-配置自动签发证书" class="headerlink" title="四、 配置自动签发证书"></a>四、 配置自动签发证书</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端删除客户端证书 puppet cert clean web10.yanyi.com</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert clean web10.yanyi.com</span></div><div class="line">Notice: Revoked certificate with serial 5</div><div class="line">Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/signed/web10.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Certificate web10.yanyi.com at <span class="string">'/var/lib/puppet/ssl/certs/web10.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端删除ssl相关文件 rm -rf /var/lib/puppet/ssl/*</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># rm -rf /var/lib/puppet/ssl/*</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端创建自动签发的配置文件 /etc/puppet/autosign.conf</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/authsign.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入如下内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">*.yanyi.com</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改服务端 puppet 配置文件 /etc/puppet/puppet.conf</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/puppet.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 [main] 下加入内容 autosign = true</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/06.png?raw=true" alt="06"><figcaption class="figure__caption">06</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端重启puppetmaster服务  /etc/init.d/puppetmaster restart</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># service puppetmaster restart</span></div><div class="line">停止 puppetmaster： [确定]</div><div class="line">启动 puppetmaster： [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端重启puppet服务 /etc/init.d/puppet restart</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># service puppet restart</span></div><div class="line">Stopping puppet agent: [确定]</div><div class="line">Starting puppet agent: [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端 puppet cert list –all#可以看到web10.aming.com已经签名</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果客户端不重启puppet服务，也可以通过命令来自动签发</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;puppet agent –test –server web9.yanyi.com</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert clean --all </span></div><div class="line">Notice: Revoked certificate with serial 6</div><div class="line">Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/ca/signed/web9.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Certificate web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/certs/web9.yanyi.com.pem'</span></div><div class="line">Notice: Removing file Puppet::SSL::Key web9.yanyi.com at <span class="string">'/var/lib/puppet/ssl/private_keys/web9.yanyi.com.pem'</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet agent --test --server web9.yanyi.com</span></div><div class="line">Info: Creating a new SSL key <span class="keyword">for</span> web9.yanyi.com</div><div class="line">Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml</div><div class="line">Info: Creating a new SSL certificate request <span class="keyword">for</span> web9.yanyi.com</div><div class="line">Info: Certificate Request fingerprint (SHA256): 84:AA:7D:13:C6:9C:F6:8E:25:7E:27:69:7C:1E:12:F1:8C:D9:D6:3B:49:74:83:E3:1A:15:9F:F0:37:F7:35:84</div><div class="line">Exiting; no certificate found and waitforcert is disabled</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet cert list --all </span></div><div class="line">+ <span class="string">"web10.yanyi.com"</span> (SHA256) 92:F3:04:9E:01:D5:A6:4B:BF:51:22:89:A2:51:F9:7A:1E:D1:53:13:19:49:2A:3D:58:9D:38:39:17:D3:AC:E2</div><div class="line">+ <span class="string">"web9.yanyi.com"</span> (SHA256) 26:5D:91:D4:B9:58:62:66:CB:48:6A:3F:CB:51:5B:DD:4C:9B:72:39:34:6E:01:C5:41:C6:DB:EE:93:3F:5D:20 (alt names: <span class="string">"DNS:puppet"</span>, <span class="string">"DNS:puppet.yanyi.com"</span>, <span class="string">"DNS:web9.yanyi.com"</span>)</div></pre></td></tr></table></figure>
<h2 id="五、测试证书"><a href="#五、测试证书" class="headerlink" title="五、测试证书"></a>五、测试证书</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端编辑配置文件 /etc/puppet/manifests/site.pp </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/manifests/site.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;添加如下内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">node default &#123;</div><div class="line">file &#123;<span class="string">"/tmp/123.txt"</span>:</div><div class="line">content =&gt; <span class="string">"test,test"</span>;</div><div class="line">     &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/07.png?raw=true" alt="07"><figcaption class="figure__caption">07</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：如果不配置该文件，则客户端不会同步任何数据</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;客户端上稍等一会（每隔30s会自动执行服务端上的任务），或者直接命令行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># puppet agent --test --server web9.yanyi.com</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样在客户端的/tmp/下会有个123.txt文件，内容为test,test</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># ls /tmp</span></div><div class="line">123.txt yum.log</div><div class="line">[root@web10 ~]<span class="comment"># cat /tmp/123.txt</span></div><div class="line"><span class="built_in">test</span>,<span class="built_in">test</span></div></pre></td></tr></table></figure>
<h2 id="六、配置模块"><a href="#六、配置模块" class="headerlink" title="六、配置模块"></a>六、配置模块</h2><h3 id="定义模块管理"><a href="#定义模块管理" class="headerlink" title="定义模块管理"></a>定义模块管理</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;模块是 puppet 的配置单元，模块里面会包含类和资源。同步文件、远程执行命令、cron 等叫做资源，都是通过模块来实现的。下面我们来写一个模块</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;服务端创建目录 mkdir /etc/puppet/modules/testm这个目录名字也作为模块名字</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># mkdir /etc/puppet/modules/testm</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后继续创建模块对应的子目录 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># mkdir /etc/puppet/modules/testm/&#123;files,manifests,templates&#125;</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;files里面存文件，可以留空，manifests里面是配置文件，templates里面是模块文件可以为空</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 files 创建文件 1.txt，内容随意</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;创建配置文件 /etc/puppet/modules/testm/manifests/init.pp</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/modules/testm/manifests/init.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;内容为</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">class testm&#123;</div><div class="line">file &#123;<span class="string">"/tmp/2.txt"</span>:</div><div class="line">      owner =&gt; <span class="string">"root"</span>,</div><div class="line">      group =&gt; <span class="string">"root"</span>,</div><div class="line">      mode =&gt; 0400,</div><div class="line">      <span class="built_in">source</span> =&gt; <span class="string">"puppet://<span class="variable">$puppetserver</span>/modules/testm/1.txt"</span></div><div class="line">&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/08.png?raw=true" alt="08"><figcaption class="figure__caption">08</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：类名字也叫做testm, 类下面定义了一个资源file，文件名字叫做/tmp/2.txt ，  owner，group，mode定义文件的属主、数组以及权限，source定义这个文件从哪里获取。 $puppetserver一会也要定义一下，这里指的是puppet server服务器上/etc/puppet/modules/testm/files/1.txt</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面要继续定义一个很关键的配置文件：/etc/puppet/manifests/site.pp </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/manifests/site.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;内容如下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="variable">$puppetserver</span> = <span class="string">'web9.yanyi.com'</span></div><div class="line">node <span class="string">'web10.yanyi.com'</span>&#123;</div><div class="line">include testm</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/09.png?raw=true" alt="09"><figcaption class="figure__caption">09</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：$puppetserver 定义服务端的主机名，node后面为客户端的主机名，这里面定义该客户端要加载的模块</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置完成后，在客户端执行命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># puppet agent --test --server=web9.aming.com</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果客户端上启动了puppet服务，不用执行这命令，它也会自动同步的</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/10.png?raw=true" alt="10"><figcaption class="figure__caption">10</figcaption></figure></p>
<h2 id="七、文件或目录资源"><a href="#七、文件或目录资源" class="headerlink" title="七、文件或目录资源"></a>七、文件或目录资源</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面的模块其实只是同步了一个文件而已，那么要想同步一个目录如何做？我们可以通过实现同步一个目录来做一个包发布系统。 比如在一台机器上编译安装好了apache，那么就可以通过这样的模块把这个apache目录整个分发到其他机器上。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># cd /etc/puppet//modules/</span></div><div class="line">[root@web9 modules]<span class="comment"># ls</span></div><div class="line">testm</div><div class="line">[root@web9 modules]<span class="comment"># cd testm</span></div><div class="line">[root@web9 testm]<span class="comment"># ls</span></div><div class="line">files manifests templates</div><div class="line">[root@web9 testm]<span class="comment"># cd manifests/</span></div><div class="line">[root@web9 manifests]<span class="comment"># ls</span></div><div class="line">init.pp</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;模块配置文件如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 manifests]<span class="comment"># vim init.pp</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">class apache&#123;</div><div class="line">file &#123;<span class="string">"/usr/local/apache2"</span>:</div><div class="line">owner =&gt; <span class="string">"root"</span>,</div><div class="line">group =&gt; <span class="string">"root"</span>,</div><div class="line"><span class="built_in">source</span> =&gt; <span class="string">"puppet://<span class="variable">$puppetserver</span>/modules/apache/apache2"</span>,</div><div class="line">recurse =&gt; <span class="literal">true</span>,</div><div class="line">purge =&gt; <span class="literal">true</span></div><div class="line">&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/11.png?raw=true" alt="11"><figcaption class="figure__caption">11</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中recurse=&gt;true 这个参数很关键，它表示递归的意思，没有这个不能同步目录。 purge参数可以保证当服务端删除某个文件，客户端可以跟着删除。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因实验虚拟机没 apache 目录更改为  testm </p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/12.png?raw=true" alt="12"><figcaption class="figure__caption">12</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参考<a href="https://hcldirgit.github.io/2017/08/20/Puppet/2.%20Puppet%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/" target="_blank" rel="external">Puppet学习之文件管理</a></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 puppet 目录下有个  manifests 目录，编辑下边的配置文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@web9 puppet]<span class="comment"># cd manifests/</span></div><div class="line">[root@web9 manifests]<span class="comment"># ls</span></div><div class="line">site.pp</div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 manifests]<span class="comment"># vim site.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;添加内容 include apache</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">include apache</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/13.png?raw=true" alt="13"><figcaption class="figure__caption">13</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看 客户端 /usr/local 目录，下边多了 apache2 文件夹</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/14.png?raw=true" alt="14"><figcaption class="figure__caption">14</figcaption></figure></p>
<h2 id="八、远程执行命令"><a href="#八、远程执行命令" class="headerlink" title="八、远程执行命令"></a>八、远程执行命令</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑配置文件 /etc/puppet/modules/testm/manifests/init.pp</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/modules/testm/manifests/init.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;添加内容</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">exec &#123;&quot;123&quot;:</div><div class="line">   unless =&gt; &quot;test -f /tmp/yanyi.txt&quot;,</div><div class="line">   path =&gt; [&quot;/bin&quot;, &quot;/sbin&quot;, &quot;/usr/bin&quot;, &quot;/usr/sbin&quot;],</div><div class="line">   command =&gt; &quot;touch /tmp/yanyi.txt&quot;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/15.png?raw=true" alt="15"><figcaption class="figure__caption">15</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：123只是作为该资源的一个名字，unless后面的命令作为一个条件，当条件成立时，不会执行下面的命令，如果想要条件成立时，执行下面的命令，用 onlyif。要注意的是，我们一定要给执行的这条命令加个条件，使用unless就可以，必须满足这个条件才能执行命令，否则这个命令会一直执行，不太妥当。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看客户端的 tmp 是否生成 yanyi.txt 文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@web10 ~]<span class="comment"># ls -lt /tmp</span></div><div class="line">总用量 8</div><div class="line">-rw-r--r-- 1 root root 0 2月 20 23:31 yanyi.txt</div><div class="line">-r-------- 1 root root 6 2月 17 04:30 2.txt</div><div class="line">-rw-r--r-- 1 root root 9 2月 17 03:40 123.txt</div><div class="line">-rw-------. 1 root root 0 2月 15 06:16 yum.log</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参考 <a href="https://hcldirgit.github.io/2017/08/20/Puppet/4.%20Puppet%20exec/" target="_blank" rel="external">puppet exec</a></p>
<h2 id="九、任务计划"><a href="#九、任务计划" class="headerlink" title="九、任务计划"></a>九、任务计划</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑配置文件 /etc/puppet/modules/testm/manifests/init.pp</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@web9 ~]<span class="comment"># vim /etc/puppet/modules/testm/manifests/init.pp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;添加内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">cron &#123;<span class="string">"yanyi1"</span>:</div><div class="line">    <span class="built_in">command</span> =&gt; <span class="string">"/sbin/ntpdate time.windows.com"</span>,</div><div class="line">    user =&gt; <span class="string">"root"</span>,</div><div class="line">    minute =&gt; <span class="string">"*/10"</span>,</div><div class="line">    <span class="comment">#ensure =&gt; "absent"</span></div><div class="line">    &#125;</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/16.png?raw=true" alt="16"><figcaption class="figure__caption">16</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：分时日月周分别对应puppet里面的minute，hour，monthday，month，weekday,ensure设置为absent为删除该任务，如果不设置改行则为建立</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看客户端是否生成该计划任务</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Puppet%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/17.png?raw=true" alt="17"><figcaption class="figure__caption">17</figcaption></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参考 <a href="https://hcldirgit.github.io/2017/08/20/Puppet/3.%20Puppet%20cron/" target="_blank" rel="external">puppet cron</a></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/9. php.ini 配置详解/">php.ini 配置详解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个文件必须命名为’’php.ini’’并放置在httpd.conf中的PHPIniDir指令指定的目录中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最新版本的php.ini可以在下面两个位置查看：</p>
<p><a href="http://cvs.php.net/viewvc.cgi/php-src/php.ini-recommended?view=co" target="_blank" rel="external">http://cvs.php.net/viewvc.cgi/php-src/php.ini-recommended?view=co</a></p>
<p><a href="http://cvs.php.net/viewvc.cgi/php-src/php.ini-dist?view=co" target="_blank" rel="external">http://cvs.php.net/viewvc.cgi/php-src/php.ini-dist?view=co</a></p>
<h2 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该文件的语法非常简单。空白字符和以分号开始的行被简单地忽略。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;章节标题(例如: [php])也被简单地忽略，即使将来它们可能有某种意义。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置指令的格式如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">directive = value</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指令名(directive)是大小写敏感的！所以”foo=bar”不同于”FOO=bar”。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;值(value)可以是：</p>
<ol>
<li>用引号界定的字符串(如：”foo”)</li>
<li>一个数字(整数或浮点数，如：0, 1, 34, -1, 33.55)</li>
<li>一个PHP常量(如：E_ALL, M_PI)</li>
<li>一个INI常量(On, Off, none)</li>
<li>一个表达式(如：E_ALL &amp; ~E_NOTICE)</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;INI文件中的表达式仅使用：位运算符、逻辑非、圆括号：</p>
<ul>
<li>| 位或</li>
<li>&amp; 位与</li>
<li>~ 位非</li>
<li>! 逻辑非</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;布尔标志用 On 表示打开，用 Off 表示关闭。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个空字符串可以用在等号后不写任何东西表示，或者用 none 关键字：</p>
<ul>
<li>foo =　　　　 ; 将foo设为空字符串</li>
<li>foo = none　　; 将foo设为空字符串</li>
<li>foo = “none”　; 将foo设为字符串’’none’’</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果在指令值中使用动态扩展(PHP扩展或Zend扩展)中的常量，那么只能在加载这些动态扩展的指令行之后使用这些常量。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">httpd.conf　;;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;还可以在httpd.conf中覆盖php.ini的值，以进行更灵活的配置：</p>
<ul>
<li>php_value name value　;设置非bool型的指令，将value设为none则清除先前的设定</li>
<li>php_flag　name on|off ;仅用于设置bool型的指令</li>
<li>PHP常量(如E_ALL)仅能在php.ini中使用，在httpd.conf中必须使用相应的掩码值。</li>
<li>带”SYS”标志的指令只能在httpd.conf中的全局配置部分使用，</li>
<li>带”ini”标志的指令不能在httpd.conf中使用，它们仅能用于php.ini中。</li>
</ul>
<h2 id="配置指令详解"><a href="#配置指令详解" class="headerlink" title="配置指令详解"></a>配置指令详解</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以下每个指令的设定值都与 PHP-5.2.0 内建的默认值相同。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也就是说，如果’’php.ini’’不存在，或者你删掉了某些行，默认值与之相同。</p>
<h3 id="Apache"><a href="#Apache" class="headerlink" title="Apache"></a>Apache</h3><h4 id="Apache-1"><a href="#Apache-1" class="headerlink" title="[Apache]"></a>[Apache]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;仅在将PHP作为Apache模块时才有效。</p>
<h5 id="engine-On"><a href="#engine-On" class="headerlink" title="engine = On"></a>engine = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否启用PHP解析引擎。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以在httpd.conf中基于目录或者虚拟主机来打开或者关闭PHP解析引擎。</p>
<h5 id="last-modified-Off"><a href="#last-modified-Off" class="headerlink" title="last_modified = Off"></a>last_modified = Off</h5><p> 是否在Last-Modified应答头中放置该PHP脚本的最后修改时间。</p>
<h5 id="xbithack-Off"><a href="#xbithack-Off" class="headerlink" title="xbithack = Off"></a>xbithack = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否不管文件结尾是什么，都作为PHP可执行位组来解析。</p>
<h5 id="child-terminate-Off"><a href="#child-terminate-Off" class="headerlink" title="child_terminate = Off"></a>child_terminate = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP脚本在请求结束后是否允许使用apache_child_terminate()函数终止子进程。该指令仅在UNIX平台上将PHP安装为Apache1.3的模块时可用。其他情况下皆不存在。</p>
<h3 id="PHP核心"><a href="#PHP核心" class="headerlink" title="PHP核心"></a>PHP核心</h3><h4 id="PHP-Core-DateTime"><a href="#PHP-Core-DateTime" class="headerlink" title="[PHP-Core-DateTime]"></a>[PHP-Core-DateTime]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;前四个配置选项目前仅用于date_sunrise()和date_sunset()函数。</p>
<h5 id="date-default-latitude-31-7667"><a href="#date-default-latitude-31-7667" class="headerlink" title="date.default_latitude = 31.7667"></a>date.default_latitude = 31.7667</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认纬度</p>
<h5 id="date-default-longitude-35-2333"><a href="#date-default-longitude-35-2333" class="headerlink" title="date.default_longitude = 35.2333"></a>date.default_longitude = 35.2333</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认经度</p>
<h5 id="date-sunrise-zenith-90-583333"><a href="#date-sunrise-zenith-90-583333" class="headerlink" title="date.sunrise_zenith = 90.583333"></a>date.sunrise_zenith = 90.583333</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认日出天顶</p>
<h5 id="date-sunset-zenith-90-583333"><a href="#date-sunset-zenith-90-583333" class="headerlink" title="date.sunset_zenith = 90.583333"></a>date.sunset_zenith = 90.583333</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认日落天顶</p>
<h5 id="date-timezone"><a href="#date-timezone" class="headerlink" title="date.timezone ="></a>date.timezone =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;未设定TZ环境变量时用于所有日期和时间函数的默认时区。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;中国大陆应当使用”PRC”，应用时区的优先顺序为：</p>
<ol>
<li>用date_default_timezone_set()函数设定的时区(如果设定了的话)</li>
<li>TZ 环境变量(如果非空的话)</li>
<li>该指令的值(如果设定了的话)</li>
<li>PHP自己推测(如果操作系统支持)</li>
<li>如果以上都不成功，则使用 UTC</li>
</ol>
<h4 id="PHP-Core-Assert"><a href="#PHP-Core-Assert" class="headerlink" title="[PHP-Core-Assert]"></a>[PHP-Core-Assert]</h4><h5 id="assert-active-On"><a href="#assert-active-On" class="headerlink" title="assert.active = On"></a>assert.active = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否启用assert()断言评估</p>
<h5 id="assert-bail-Off"><a href="#assert-bail-Off" class="headerlink" title="assert.bail = Off"></a>assert.bail = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否在发生失败断言时中止脚本的执行</p>
<h5 id="assert-callback"><a href="#assert-callback" class="headerlink" title="assert.callback ="></a>assert.callback =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;发生失败断言时执行的回调函数</p>
<h5 id="assert-quiet-eval-Off"><a href="#assert-quiet-eval-Off" class="headerlink" title="assert.quiet_eval = Off"></a>assert.quiet_eval = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否使用安静评估(不显示任何错误信息，相当于error_reporting=0)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若关闭则在评估断言表达式的时候使用当前的error_reporting指令值。</p>
<h5 id="assert-warning-On"><a href="#assert-warning-On" class="headerlink" title="assert.warning = On"></a>assert.warning = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否对每个失败断言都发出警告</p>
<h5 id="PHP-Core-SafeMode"><a href="#PHP-Core-SafeMode" class="headerlink" title="[PHP-Core-SafeMode]"></a>[PHP-Core-SafeMode]</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安全模式是为了解决共享服务器的安全问题而设立的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但试图在PHP层解决这个问题在结构上是不合理的，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正确的做法应当是修改web服务器层和操作系统层。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因此在PHP6中废除了安全模式，并打算使用open_basedir指令取代之。</p>
<h5 id="safe-mode-Off"><a href="#safe-mode-Off" class="headerlink" title="safe_mode = Off"></a>safe_mode = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否启用安全模式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开时，PHP将检查当前脚本的拥有者是否和被操作的文件的拥有者相同，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;相同则允许操作，不同则拒绝操作。</p>
<h5 id="safe-mode-gid-Off"><a href="#safe-mode-gid-Off" class="headerlink" title="safe_mode_gid = Off"></a>safe_mode_gid = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，默认在访问文件时会做UID比较检查。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但有些情况下严格的UID检查反而是不适合的，宽松的GID检查已经足够。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想将其放宽到仅做GID比较，可以打开这个参数。</p>
<h5 id="safe-mode-allowed-envvars-“PHP“"><a href="#safe-mode-allowed-envvars-“PHP“" class="headerlink" title="safe_mode_allowed_envvars = “PHP“"></a>safe_mode_allowed_env<em>vars = “PHP</em>“</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，用户仅可以更改的环境变量的前缀列表(逗号分隔)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;允许用户设置某些环境变量，可能会导致潜在的安全漏洞。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意: 如果这一参数值为空，PHP将允许用户更改任意环境变量！</p>
<h5 id="safe-mode-protected-env-vars-“LD-LIBRARY-PATH”"><a href="#safe-mode-protected-env-vars-“LD-LIBRARY-PATH”" class="headerlink" title="safe_mode_protected_env_vars = “LD_LIBRARY_PATH”"></a>safe_mode_protected_env_vars = “LD_LIBRARY_PATH”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，用户不能更改的环境变量列表(逗号分隔)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些变量即使在safe_mode_allowed_env_vars指令设置为允许的情况下也会得到保护。</p>
<h5 id="safe-mode-exec-dir-“-usr-local-php-bin”"><a href="#safe-mode-exec-dir-“-usr-local-php-bin”" class="headerlink" title="safe_mode_exec_dir = “/usr/local/php/bin”"></a>safe_mode_exec_dir = “/usr/local/php/bin”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，只有该目录下的可执行程序才允许被执行系统程序的函数执行。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些函数是：system, escapeshellarg, escapeshellcmd, exec, passthru,proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec</p>
<h5 id="safe-mode-include-dir"><a href="#safe-mode-include-dir" class="headerlink" title="safe_mode_include_dir ="></a>safe_mode_include_dir =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，该组目录和其子目录下的文件被包含时，将跳过UID/GID检查。换句话说，如果此处的值为空，任何UID/GID不符合的文件都不允许被包含。这里设置的目录必须已经存在于include_path指令中或者用完整路径来包含。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;多个目录之间用冒号(Win下为分号)隔开。指定的限制实际上是一个前缀，而非一个目录名，也就是说”/dir/incl”将允许访问”/dir/include”和”/dir/incls”如果您希望将访问控制在一个指定的目录，那么请在结尾加上斜线。</p>
<h5 id="sql-safe-mode-Off"><a href="#sql-safe-mode-Off" class="headerlink" title="sql.safe_mode = Off"></a>sql.safe_mode = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否使用SQL安全模式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果打开，指定默认值的数据库连接函数将会使用这些默认值代替支持的参数。对于每个不同数据库的连接函数，其默认值请参考相应的手册页面。</p>
<h4 id="PHP-Core-Safe"><a href="#PHP-Core-Safe" class="headerlink" title="[PHP-Core-Safe]"></a>[PHP-Core-Safe]</h4><h5 id="allow-url-fopen-On"><a href="#allow-url-fopen-On" class="headerlink" title="allow_url_fopen = On"></a>allow_url_fopen = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ni</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许打开远程文件</p>
<h5 id="allow-url-include-Off"><a href="#allow-url-include-Off" class="headerlink" title="allow_url_include = Off"></a>allow_url_include = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许include/require远程文件。<br>disable_classes =</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ini<br>    该指令接受一个用逗号分隔的类名列表，以禁用特定的类。<br>disable_functions =</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ini</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该指令接受一个用逗号分隔的函数名列表，以禁用特定的函数。</p>
<h5 id="enable-dl-On"><a href="#enable-dl-On" class="headerlink" title="enable_dl = On"></a>enable_dl = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许使用dl()函数。dl()函数仅在将PHP作为apache模块安装时才有效。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;禁用dl()函数主要是出于安全考虑，因为它可以绕过open_basedir指令的限制。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下始终禁用dl()函数，而不管此处如何设置。</p>
<h5 id="expose-php-On"><a href="#expose-php-On" class="headerlink" title="expose_php = On"></a>expose_php = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ini</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否暴露PHP被安装在服务器上的事实(在http头中加上其签名)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它不会有安全上的直接威胁，但它使得客户端知道服务器上安装了PHP。</p>
<h5 id="open-basedir"><a href="#open-basedir" class="headerlink" title="open_basedir ="></a>open_basedir =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将PHP允许操作的所有文件(包括文件自身)都限制在此组目录列表下。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当一个脚本试图打开一个指定目录树之外的文件时，将遭到拒绝。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 所有的符号连接都会被解析，所以不可能通过符号连接来避开此限制。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;特殊值’’.’’指定了存放该脚本的目录将被当做基准目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但这有些危险，因为脚本的工作目录可以轻易被chdir()改变。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于共享服务器，在httpd.conf中灵活设置该指令将变得非常有用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Windows中用分号分隔目录，UNIX系统中用冒号分隔目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;作为Apache模块时，父目录中的open_basedir路径将自动被继承。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定的限制实际上是一个前缀，而非一个目录名，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也就是说”/dir/incl”将允许访问”/dir/include”和”/dir/incls”，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果希望将访问控制在一个指定的目录，那么请在结尾加上一个斜线。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认是允许打开所有文件。</p>
<h4 id="PHP-Core-Error"><a href="#PHP-Core-Error" class="headerlink" title="[PHP-Core-Error]"></a>[PHP-Core-Error]</h4><h5 id="error-reporting-E-ALL-amp-E-NOTICE"><a href="#error-reporting-E-ALL-amp-E-NOTICE" class="headerlink" title="error_reporting = E_ALL &amp; ~E_NOTICE"></a>error_reporting = E_ALL &amp; ~E_NOTICE</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;错误报告级别是位字段的叠加，推荐使用 E_ALL | E_STRICT</p>
<ul>
<li>1　E_ERROR　　　　　　 致命的运行时错误</li>
<li>2　E_WARNING　　　　　 运行时警告(非致命性错误)</li>
<li>4　E_PARSE　　　　　　 编译时解析错误</li>
<li>8　E_NOTICE　　　　　　运行时提醒(经常是bug，也可能是有意的)</li>
<li>16　E_CORE_ERROR　　　　PHP启动时初始化过程中的致命错误</li>
<li>32　E_CORE_WARNING　　　PHP启动时初始化过程中的警告(非致命性错)</li>
<li>64　E_COMPILE_ERROR　　 编译时致命性错</li>
<li>128　E_COMPILE_WARNING　 编译时警告(非致命性错)</li>
<li>256　E_USER_ERROR　　　　用户自定义的致命错误</li>
<li>512　E_USER_WARNING　　　用户自定义的警告(非致命性错误)</li>
<li>1024　E_USER_NOTICE　　　 用户自定义的提醒(经常是bug，也可能是有意的)</li>
<li>2048　E_STRICT　　　　　　编码标准化警告(建议如何修改以向前兼容)</li>
<li>4096　E_RECOVERABLE_ERROR 接近致命的运行时错误，若未被捕获则视同E_ERROR</li>
<li>6143　E_ALL　　　　　　　 除E_STRICT外的所有错误(PHP6中为8191,即包含所有)</li>
</ul>
<h5 id="track-errors-Off"><a href="#track-errors-Off" class="headerlink" title="track_errors = Off"></a>track_errors = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否在变量$php_errormsg中保存最近一个错误或警告消息。</p>
<h5 id="display-errors-On"><a href="#display-errors-On" class="headerlink" title="display_errors = On"></a>display_errors = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否将错误信息作为输出的一部分显示。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在最终发布的web站点上，强烈建议你关掉这个特性，并使用错误日志代替(参看下面)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在最终发布的web站点打开这个特性可能暴露一些安全信息，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如web服务上的文件路径、数据库规划或别的信息。</p>
<h5 id="display-startup-errors-Off"><a href="#display-startup-errors-Off" class="headerlink" title="display_startup_errors = Off"></a>display_startup_errors = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否显示PHP启动时的错误。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;即使display_errors指令被打开，关闭此参数也将不显示PHP启动时的错误。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;建议关掉这个特性，除非必须要用于调试中。</p>
<h5 id="report-memleaks-On"><a href="#report-memleaks-On" class="headerlink" title="report_memleaks = On"></a>report_memleaks = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否报告内存泄漏。这个参数只在以调试方式编译的PHP中起作用，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;并且必须在error_reporting指令中包含 E_WARNING</p>
<h5 id="report-zend-debug-On"><a href="#report-zend-debug-On" class="headerlink" title="report_zend_debug = On"></a>report_zend_debug = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;尚无说明文档</p>
<h5 id="html-errors-On"><a href="#html-errors-On" class="headerlink" title="html_errors = On"></a>html_errors = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否在出错信息中使用HTML标记。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意: 不要在发布的站点上使用这个特性！</p>
<h5 id="docref-root-”http-localhost-phpmanual-“"><a href="#docref-root-”http-localhost-phpmanual-“" class="headerlink" title="docref_root =　;”http://localhost/phpmanual/“"></a>docref_root =　;”<a href="http://localhost/phpmanual/" target="_blank" rel="external">http://localhost/phpmanual/</a>“</h5><h5 id="docref-ext-”-html”"><a href="#docref-ext-”-html”" class="headerlink" title="docref_ext =　 ;”.html”"></a>docref_ext =　 ;”.html”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果打开了html_errors指令，PHP将会在出错信息上显示超连接，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;直接链接到一个说明这个错误或者导致这个错误的函数的页面。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以从<a href="http://www.php.net/docs.php下载php手册，" target="_blank" rel="external">http://www.php.net/docs.php下载php手册，</a></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;并将docref_root指令指向本地的手册所在的URL目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;还必须设置docref_ext指令来指定文件的扩展名(必须含有’’.’’)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意: 不要在发布的站点上使用这个特性。</p>
<h5 id="error-prepend-string-”“"><a href="#error-prepend-string-”“" class="headerlink" title="error_prepend_string =　;”“"></a>error_prepend_string =　;”<font color="#f00">“</font></h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用于错误信息前输出的字符串</p>
<h5 id="error-append-string-”“"><a href="#error-append-string-”“" class="headerlink" title="error_append_string =　 ;”“"></a>error_append_string =　 ;”“</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用于错误信息后输出的字符串</p>
<h5 id="xmlrpc-errors-Off"><a href="#xmlrpc-errors-Off" class="headerlink" title="xmlrpc_errors = Off"></a>xmlrpc_errors = Off</h5><h5 id="xmlrpc-error-number-0"><a href="#xmlrpc-error-number-0" class="headerlink" title="xmlrpc_error_number = 0"></a>xmlrpc_error_number = 0</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;尚无文档</p>
<h4 id="PHP-Core-Logging"><a href="#PHP-Core-Logging" class="headerlink" title="[PHP-Core-Logging]"></a>[PHP-Core-Logging]</h4><h5 id="define-syslog-variables-Off"><a href="#define-syslog-variables-Off" class="headerlink" title="define_syslog_variables = Off"></a>define_syslog_variables = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否定义各种系统日志变量，如：$LOG_PID, $LOG_CRON 等等。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;关掉它以提高效率的好主意。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以在运行时调用define_syslog_variables()函数来定义这些变量。</p>
<h5 id="error-log"><a href="#error-log" class="headerlink" title="error_log ="></a>error_log =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将错误日志记录到哪个文件中。该文件必须对Web服务器用户可写。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;syslog 表示记录到系统日志中(NT下的事件日志, Unix下的syslog(3))</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果此处未设置任何值，则错误将被记录到Web服务器的错误日志中。</p>
<h5 id="log-errors-Off"><a href="#log-errors-Off" class="headerlink" title="log_errors = Off"></a>log_errors = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否在日志文件里记录错误，具体在哪里记录取决于error_log指令。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;强烈建议你在最终发布的web站点时使用日志记录错误而不是直接输出，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样可以让你既知道那里出了问题，又不会暴露敏感信息。</p>
<h5 id="log-errors-max-len-1024"><a href="#log-errors-max-len-1024" class="headerlink" title="log_errors_max_len = 1024"></a>log_errors_max_len = 1024</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置错误日志中附加的与错误信息相关联的错误源的最大长度。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里设置的值对显示的和记录的错误以及$php_errormsg都有效。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设为 0 可以允许无限长度。</p>
<h5 id="ignore-repeated-errors-Off"><a href="#ignore-repeated-errors-Off" class="headerlink" title="ignore_repeated_errors = Off"></a>ignore_repeated_errors = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;记录错误日志时是否忽略重复的错误信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;错误信息必须出现在同一文件的同一行才被被视为重复。</p>
<h5 id="ignore-repeated-source-Off"><a href="#ignore-repeated-source-Off" class="headerlink" title="ignore_repeated_source = Off"></a>ignore_repeated_source = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否在忽略重复的错误信息时忽略重复的错误源。</p>
<h4 id="PHP-Core-Mail"><a href="#PHP-Core-Mail" class="headerlink" title="[PHP-Core-Mail]"></a>[PHP-Core-Mail]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要使邮件函数可用，PHP必须在编译时能够访问sendmail程序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果使用其它的邮件程序，如qmail或postfix，确保使用了相应的sendmail包装。PHP首先会在系统的PATH环境变量中搜索 sendmail，接着按以下顺序搜索：/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;强烈建议在PATH中能够找到sendmail。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外，编译PHP的用户必须能够访问sendmail程序。</p>
<h5 id="SMTP-“localhost”"><a href="#SMTP-“localhost”" class="headerlink" title="SMTP = “localhost”"></a>SMTP = “localhost”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mail()函数中用来发送邮件的SMTP服务器的主机名称或者IP地址。仅用于win32。</p>
<h5 id="smtp-port-25"><a href="#smtp-port-25" class="headerlink" title="smtp_port = 25"></a>smtp_port = 25</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SMTP服务器的端口号。仅用于win32。</p>
<h5 id="sendmail-from"><a href="#sendmail-from" class="headerlink" title="sendmail_from ="></a>sendmail_from =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;发送邮件时使用的”From:”头中的邮件地址。仅用于win32</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该选项还同时设置了”Return-Path:”头。</p>
<h5 id="sendmail-path-“-t-i”"><a href="#sendmail-path-“-t-i”" class="headerlink" title="sendmail_path = “-t -i”"></a>sendmail_path = “-t -i”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;仅用于unix，也可支持参数(默认的是’’sendmail -t -i’’)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sendmail程序的路径，通常为”/usr/sbin/sendmail或/usr/lib/sendmail”。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;configure脚本会尝试找到该程序并设定为默认值，但是如果失败的话，可以在这里设定。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不使用sendmail的系统应将此指令设定为sendmail替代程序(如果有的话)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如，Qmail用户通常可以设为”/var/qmail/bin/sendmail”或”/var/qmail/bin/qmail-inject”。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;qmail-inject 不需要任何选项就能正确处理邮件。</p>
<h5 id="mail-force-extra-parameters"><a href="#mail-force-extra-parameters" class="headerlink" title="mail.force_extra_parameters ="></a>mail.force_extra_parameters =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;作为额外的参数传递给sendmail库的强制指定的参数附加值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些参数总是会替换掉mail()的第5个参数，即使在安全模式下也是如此。</p>
<h4 id="PHP-Core-ResourceLimit"><a href="#PHP-Core-ResourceLimit" class="headerlink" title="[PHP-Core-ResourceLimit]"></a>[PHP-Core-ResourceLimit]</h4><h5 id="default-socket-timeout-60"><a href="#default-socket-timeout-60" class="headerlink" title="default_socket_timeout = 60"></a>default_socket_timeout = 60</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认socket超时(秒)</p>
<h5 id="max-execution-time-30"><a href="#max-execution-time-30" class="headerlink" title="max_execution_time = 30"></a>max_execution_time = 30</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每个脚本最大允许执行时间(秒)，0 表示没有限制。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数有助于阻止劣质脚本无休止的占用服务器资源。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该指令仅影响脚本本身的运行时间，任何其它花费在脚本运行之外的时间，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如用system()/sleep()函数的使用、数据库查询、文件上传等，都不包括在内。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在安全模式下，你不能用ini_set()在运行时改变这个设置。</p>
<h5 id="memory-limit-16M"><a href="#memory-limit-16M" class="headerlink" title="memory_limit = 16M"></a>memory_limit = 16M</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个脚本所能够申请到的最大内存字节数(可以使用K和M作为单位)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这有助于防止劣质脚本消耗完服务器上的所有内存。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要能够使用该指令必须在编译时使用”–enable-memory-limit”配置选项。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果要取消内存限制，则必须将其设为 -1 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置了该指令后，memory_get_usage()函数将变为可用。</p>
<h5 id="max-input-time-1"><a href="#max-input-time-1" class="headerlink" title="max_input_time = -1"></a>max_input_time = -1</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每个脚本解析输入数据(POST, GET, upload)的最大允许时间(秒)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-1 表示不限制。</p>
<h5 id="post-max-size-8M"><a href="#post-max-size-8M" class="headerlink" title="post_max_size = 8M"></a>post_max_size = 8M</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;允许的POST数据最大字节长度。此设定也影响到文件上传。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果POST数据超出限制，那么$_POST和$_FILES将会为空。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要上传大文件，该值必须大于upload_max_filesize指令的值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果启用了内存限制，那么该值应当小于memory_limit指令的值。</p>
<h5 id="realpath-cache-size-16K"><a href="#realpath-cache-size-16K" class="headerlink" title="realpath_cache_size = 16K"></a>realpath_cache_size = 16K</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定PHP使用的realpath(规范化的绝对路径名)缓冲区大小。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在PHP打开大量文件的系统上应当增大该值以提高性能。</p>
<h5 id="realpath-cache-ttl-120"><a href="#realpath-cache-ttl-120" class="headerlink" title="realpath_cache_ttl = 120"></a>realpath_cache_ttl = 120</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;realpath缓冲区中信息的有效期(秒)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对文件很少变动的系统，可以增大该值以提高性能。</p>
<h4 id="PHP-Core-FileUpLoad"><a href="#PHP-Core-FileUpLoad" class="headerlink" title="[PHP-Core-FileUpLoad]"></a>[PHP-Core-FileUpLoad]</h4><h5 id="file-uploads-On"><a href="#file-uploads-On" class="headerlink" title="file_uploads = On"></a>file_uploads = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许HTTP文件上传。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参见upload_max_filesize, upload_tmp_dir, post_max_size指令</p>
<h5 id="upload-max-filesize-2M"><a href="#upload-max-filesize-2M" class="headerlink" title="upload_max_filesize = 2M"></a>upload_max_filesize = 2M</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;允许上传的文件的最大尺寸。</p>
<h5 id="upload-tmp-dir"><a href="#upload-tmp-dir" class="headerlink" title="upload_tmp_dir ="></a>upload_tmp_dir =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;文件上传时存放文件的临时目录(必须是PHP进程用户可写的目录)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果未指定则PHP使用系统默认的临时目录。</p>
<h4 id="PHP-Core-MagicQuotes"><a href="#PHP-Core-MagicQuotes" class="headerlink" title="[PHP-Core-MagicQuotes]"></a>[PHP-Core-MagicQuotes]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP6将取消魔术引号，相当于下列指令全部为 Off</p>
<h5 id="magic-quotes-gpc-On"><a href="#magic-quotes-gpc-On" class="headerlink" title="magic_quotes_gpc = On"></a>magic_quotes_gpc = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否对输入的GET/POST/Cookie数据使用自动字符串转义( ‘’　“　　NULL )。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里的设置将自动影响 $_GEST $_POST $_COOKIE 数组的值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若将本指令与magic_quotes_sybase指令同时打开，则仅将单引号(‘’)转义为(‘’’’)，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其它特殊字符将不被转义，即( “　　NULL )将保持原样！！</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;建议关闭此特性，并使用自定义的过滤函数。</p>
<h5 id="magic-quotes-runtime-Off"><a href="#magic-quotes-runtime-Off" class="headerlink" title="magic_quotes_runtime = Off"></a>magic_quotes_runtime = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否对运行时从外部资源产生的数据使用自动字符串转义( ‘’　“　　NULL )。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若打开本指令，则大多数函数从外部资源(数据库,文本文件等)返回数据都将被转义。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如：用SQL查询得到的数据，用exec()函数得到的数据，等等—www.bianceng.cn</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若将本指令与magic_quotes_sybase指令同时打开，则仅将单引号(‘’)转义为(‘’’’)，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其它特殊字符将不被转义，即( “　　NULL )将保持原样！！</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;建议关闭此特性，并视具体情况使用自定义的过滤函数。</p>
<h5 id="magic-quotes-sybase-Off"><a href="#magic-quotes-sybase-Off" class="headerlink" title="magic_quotes_sybase = Off"></a>magic_quotes_sybase = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否采用Sybase形式的自动字符串转义(用 ‘’’’ 表示 ‘’)</p>
<h4 id="PHP-Core-HighLight"><a href="#PHP-Core-HighLight" class="headerlink" title="[PHP-Core-HighLight]"></a>[PHP-Core-HighLight]</h4><p><strong>highlight.bg = “#FFFFFF”</strong><br><strong>highlight.comment = “#FF8000”</strong><br><strong>highlight.default = “#0000BB”</strong><br><strong>highlight.html = “#000000”</strong><br><strong>highlight.keyword = “#007700”</strong><br><strong>highlight.string = “#DD0000”</strong>    </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;语法高亮模式的色彩(通常用于显示 .phps 文件)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;只要能被<font color="xxx">接受的东西就能正常工作。</font></p>
<h4 id="PHP-Core-Langue"><a href="#PHP-Core-Langue" class="headerlink" title="[PHP-Core-Langue]"></a>[PHP-Core-Langue]</h4><h5 id="short-open-tag-On"><a href="#short-open-tag-On" class="headerlink" title="short_open_tag = On"></a>short_open_tag = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许使用”&lt;? ?&gt;”短标识。否则必须使用”&lt;?php ?&gt;”长标识。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除非你的php程序仅在受控环境下运行，且只供自己使用，否则请不要使用短标记。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果要和XML结合使用PHP，可以选择关闭此选项以方便直接嵌入”&lt;?xml … ?&gt;”，不然你必须用PHP来输出：&lt;? echo ‘’&lt;?xml version=”1.0”‘’; ?&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;本指令也会影响到缩写形式”&lt;?=”，它和”&lt;? echo”等价，要使用它也必须打开短标记。</p>
<h5 id="asp-tags-Off"><a href="#asp-tags-Off" class="headerlink" title="asp_tags = Off"></a>asp_tags = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否允许ASP风格的标记”&lt;% %&gt;”，这也会影响到缩写形式”&lt;%=”。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP6中将删除此指令</p>
<h5 id="arg-separator-output-“-amp-”"><a href="#arg-separator-output-“-amp-”" class="headerlink" title="arg_separator.output = “&amp;”"></a>arg_separator.output = “&amp;”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP所产生的URL中用来分隔参数的分隔符。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外还可以用”&amp;”或”,”等等。</p>
<h5 id="arg-separator-input-“-amp-”"><a href="#arg-separator-input-“-amp-”" class="headerlink" title="arg_separator.input = “&amp;”"></a>arg_separator.input = “&amp;”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP解析URL中的变量时使用的分隔符列表。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;字符串中的每一个字符都会被当作分割符。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外还可以用”,&amp;”等等。</p>
<h5 id="allow-call-time-pass-reference-On"><a href="#allow-call-time-pass-reference-On" class="headerlink" title="allow_call_time_pass_reference = On"></a>allow_call_time_pass_reference = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否强迫在函数调用时按引用传递参数(每次使用此特性都会收到一条警告)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;php反对这种做法，并在将来的版本里不再支持，因为它影响到了代码的整洁。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;鼓励的方法是在函数声明里明确指定哪些参数按引用传递。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我们鼓励你关闭这一选项，以保证你的脚本在将来版本的语言里仍能正常工作。</p>
<h5 id="auto-globals-jit-On"><a href="#auto-globals-jit-On" class="headerlink" title="auto_globals_jit = On"></a>auto_globals_jit = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否仅在使用到$_SERVER和$_ENV变量时才创建(而不是在脚本一启动时就自动创建)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果并未在脚本中使用这两个数组，打开该指令将会获得性能上的提升。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要想该指令生效，必须关闭register_globals和register_long_arrays指令。</p>
<h5 id="auto-prepend-file"><a href="#auto-prepend-file" class="headerlink" title="auto_prepend_file ="></a>auto_prepend_file =</h5><h5 id="auto-append-file"><a href="#auto-append-file" class="headerlink" title="auto_append_file　="></a>auto_append_file　=</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定在主文件之前/后自动解析的文件名。为空表示禁用该特性。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该文件就像调用了include()函数被包含进来一样，因此会使用include_path指令的值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意：如果脚本通过exit()终止，那么自动后缀将不会发生。—www.bianceng.cn</p>
<h5 id="variables-order-“EGPCS”"><a href="#variables-order-“EGPCS”" class="headerlink" title="variables_order = “EGPCS”"></a>variables_order = “EGPCS”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP注册 Environment, GET, POST, Cookie, Server 变量的顺序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;分别用 E, G, P, C, S 表示，按从左到右注册，新值覆盖旧值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;举例说，设为”GP”将会导致用POST变量覆盖同名的GET变量，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;并完全忽略 Environment, Cookie, Server 变量。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;推荐使用”GPC”或”GPCS”，并使用getenv()函数访问环境变量。</p>
<h5 id="register-globals-Off"><a href="#register-globals-Off" class="headerlink" title="register_globals = Off"></a>register_globals = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否将 E, G, P, C, S 变量注册为全局变量。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开该指令可能会导致严重的安全问题，除非你的脚本经过非常仔细的检查。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;推荐使用预定义的超全局变量：$_ENV, $_GET, $_POST, $_COOKIE, $_SERVER</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该指令受variables_order指令的影响。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP6中已经删除此指令。</p>
<h5 id="register-argc-argv-On"><a href="#register-argc-argv-On" class="headerlink" title="register_argc_argv = On"></a>register_argc_argv = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否声明$argv和$argc全局变量(包含用GET方法的信息)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;建议不要使用这两个变量，并关掉该指令以提高性能。</p>
<h5 id="register-long-arrays-On"><a href="#register-long-arrays-On" class="headerlink" title="register_long_arrays = On"></a>register_long_arrays = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否启用旧式的长式数组(HTTP_*_VARS)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;鼓励使用短式的预定义超全局数组，并关闭该特性以获得更好的性能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP6中已经删除此指令。</p>
<h5 id="always-populate-raw-post-data-Off"><a href="#always-populate-raw-post-data-Off" class="headerlink" title="always_populate_raw_post_data = Off"></a>always_populate_raw_post_data = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否总是生成$HTTP_RAW_POST_DATA变量(原始POST数据)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;否则，此变量仅在遇到不能识别的MIME类型的数据时才产生。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不过，访问原始POST数据的更好方法是 php://input 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$HTTP_RAW_POST_DATA对于enctype=”multipart/form-data”的表单数据不可用。</p>
<h5 id="unserialize-callback-func"><a href="#unserialize-callback-func" class="headerlink" title="unserialize_callback_func ="></a>unserialize_callback_func =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果解序列化处理器需要实例化一个未定义的类，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里指定的回调函数将以该未定义类的名字作为参数被unserialize()调用，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以免得到不完整的”__PHP_Incomplete_Class”对象。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果这里没有指定函数，或指定的函数不包含(或实现)那个未定义的类，将会显示警告信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所以仅在确实需要实现这样的回调函数时才设置该指令。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若要禁止这个特性，只需置空即可。</p>
<h5 id="y2k-compliance-On"><a href="#y2k-compliance-On" class="headerlink" title="y2k_compliance = On"></a>y2k_compliance = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否强制打开2000年适应(可能在非Y2K适应的浏览器中导致问题)。</p>
<h5 id="zend-ze1-compatibility-mode-Off"><a href="#zend-ze1-compatibility-mode-Off" class="headerlink" title="zend.ze1_compatibility_mode = Off"></a>zend.ze1_compatibility_mode = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否使用兼容Zend引擎I(PHP 4.x)的模式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这将影响对象的复制、构造(无属性的对象会产生FALSE或0)、比较。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;兼容模式下，对象将按值传递，而不是默认的按引用传递。</p>
<h5 id="precision-14"><a href="#precision-14" class="headerlink" title="precision = 14"></a>precision = 14</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;浮点型数据显示的有效位数。</p>
<h5 id="serialize-precision-100"><a href="#serialize-precision-100" class="headerlink" title="serialize_precision = 100"></a>serialize_precision = 100</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将浮点型和双精度型数据序列化存储时的精度(有效位数)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认值能够确保浮点型数据被解序列化程序解码时不会丢失数据。</p>
<h4 id="PHP-Core-OutputControl"><a href="#PHP-Core-OutputControl" class="headerlink" title="[PHP-Core-OutputControl]"></a>[PHP-Core-OutputControl]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;输出控制函数很有用，特别是在已经输出了信息之后再发送HTTP头的情况下。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;输出控制函数不会作用于header()或setcookie()等函数发送的HTTP头，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而只会影响类似于echo()函数输出的信息和嵌入在PHP代码之间的信息。</p>
<h5 id="implicit-flush-Off"><a href="#implicit-flush-Off" class="headerlink" title="implicit_flush = Off"></a>implicit_flush = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否要求PHP输出层在每个输出块之后自动刷新数据。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这等效于在每个 print()、echo()、HTML块 之后自动调用flush()函数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开这个选项对程序执行的性能有严重的影响，通常只推荐在调试时使用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在CLI SAPI的执行模式下，该指令默认为 On 。</p>
<h5 id="output-buffering-0"><a href="#output-buffering-0" class="headerlink" title="output_buffering = 0"></a>output_buffering = 0</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;输出缓冲区大小(字节)。建议值为4096~8192。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;输出缓冲允许你甚至在输出正文内容之后再发送HTTP头(包括cookies)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其代价是输出层减慢一点点速度。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置输出缓冲可以减少写入，有时还能减少网络数据包的发送。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个参数的实际收益很大程度上取决于你使用的是什么Web服务器以及什么样的脚本。</p>
<h5 id="output-handler"><a href="#output-handler" class="headerlink" title="output_handler ="></a>output_handler =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将所有脚本的输出重定向到一个输出处理函数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如，重定向到mb_output_handler()函数时，字符编码将被透明地转换为指定的编码。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一旦你在这里指定了输出处理程序，输出缓冲将被自动打开(output_buffering=4096)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意0: 此处仅能使用PHP内置的函数，自定义函数应在脚本中使用ob_start()指定。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意1: 可移植脚本不能依赖该指令，而应使用ob_start()函数明确指定输出处理函数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用这个指令可能会导致某些不熟悉的脚本出错。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意2: 不能同时使用”mb_output_handler”和”ob_iconv_handler”两个输出处理函数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也不能同时使用”ob_gzhandler”输出处理函数和zlib.output_compression指令。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意3: 如果使用zlib.output_handler指令开启zlib输出压缩，该指令必须为空。</p>
<h4 id="PHP-Core-Directory"><a href="#PHP-Core-Directory" class="headerlink" title="[PHP-Core-Directory]"></a>[PHP-Core-Directory]</h4><h5 id="doc-root"><a href="#doc-root" class="headerlink" title="doc_root ="></a>doc_root =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP的”根目录”。仅在非空时有效。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果safe_mode=On，则此目录之外的文件一概被拒绝。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果编译PHP时没有指定FORCE_REDIRECT，并且在非IIS服务器上以CGI方式运行，则必须设置此指令(参见手册中的安全部分)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;替代方案是使用的cgi.force_redirect指令。</p>
<h5 id="include-path-“-path-to-php-pear”"><a href="#include-path-“-path-to-php-pear”" class="headerlink" title="include_path = “.:/path/to/php/pear”"></a>include_path = “.:/path/to/php/pear”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定一组目录用于require(), include(), fopen_with_path()函数寻找文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;格式和系统的PATH环境变量类似(UNIX下用冒号分隔，Windows下用分号分隔)：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UNIX: “/path1:/path2”</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Windows: “path1;path2”</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在包含路径中使用’’.’’可以允许相对路径，它代表当前目录。</p>
<h5 id="user-dir"><a href="#user-dir" class="headerlink" title="user_dir ="></a>user_dir =</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;告诉php在使用 /~username 打开脚本时到哪个目录下去找，仅在非空时有效。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也就是在用户目录之下使用PHP文件的基本目录名，例如：”public_html”</p>
<h5 id="extension-dir-“-path-to-php”"><a href="#extension-dir-“-path-to-php”" class="headerlink" title="extension_dir = “/path/to/php”"></a>extension_dir = “/path/to/php”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SYS</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;存放扩展库(模块)的目录，也就是PHP用来寻找动态扩展模块的目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Windows下默认为”C:/php5”</p>
<h4 id="PHP-Core-HTTP"><a href="#PHP-Core-HTTP" class="headerlink" title="[PHP-Core-HTTP]"></a>[PHP-Core-HTTP]</h4><h5 id="default-mimetype-“text-html”"><a href="#default-mimetype-“text-html”" class="headerlink" title="default_mimetype = “text/html”"></a>default_mimetype = “text/html”</h5><h5 id="default-charset-”gb2312”"><a href="#default-charset-”gb2312”" class="headerlink" title="default_charset =　;”gb2312”"></a>default_charset =　;”gb2312”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP默认会自动输出”Content-Type: text/html” HTTP头。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果将default_charset指令设为”gb2312”，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么将会自动输出”Content-Type: text/html; charset=gb2312”。</p>
<h4 id="PHP-Core-Unicode"><a href="#PHP-Core-Unicode" class="headerlink" title="[PHP-Core-Unicode]"></a>[PHP-Core-Unicode]</h4><h5 id="detect-unicode-On"><a href="#detect-unicode-On" class="headerlink" title="detect_unicode = On"></a>detect_unicode = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;尚无文档</p>
<h4 id="PHP-Core-Misc"><a href="#PHP-Core-Misc" class="headerlink" title="[PHP-Core-Misc]"></a>[PHP-Core-Misc]</h4><h5 id="auto-detect-line-endings-Off"><a href="#auto-detect-line-endings-Off" class="headerlink" title="auto_detect_line_endings = Off"></a>auto_detect_line_endings = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否让PHP自动侦测行结束符(EOL)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果的你脚本必须处理Macintosh文件，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;或者你运行在Macintosh上，同时又要处理unix或win32文件，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开这个指令可以让PHP自动侦测EOL，以便fgets()和file()函数可以正常工作。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但同时也会导致在Unix系统下使用回车符(CR)作为项目分隔符的人遭遇不兼容行为。</p>
<h5 id="cgi-rfc2616-headers-0"><a href="#cgi-rfc2616-headers-0" class="headerlink" title="cgi.rfc2616_headers = 0"></a>cgi.rfc2616_headers = 0</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指定PHP在发送HTTP响应代码时使用何种报头。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0 表示发送一个”Status: “报头，Apache和其它web服务器都支持。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若设为1，则PHP使用RFC2616标准的头。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除非你知道自己在做什么，否则保持其默认值 0</p>
<h5 id="cgi-nph-Off"><a href="#cgi-nph-Off" class="headerlink" title="cgi.nph = Off"></a>cgi.nph = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在CGI模式下是否强制对所有请求都发送”Status: 200”状态码。</p>
<h5 id="fastcgi-impersonate-Off"><a href="#fastcgi-impersonate-Off" class="headerlink" title="fastcgi.impersonate = Off"></a>fastcgi.impersonate = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IIS中的FastCGI支持模仿客户端安全令牌的能力。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这使得IIS能够定义运行时所基于的请求的安全上下文。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Apache中的mod_fastcgi不支持此特性(03/17/2002)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果在IIS中运行则设为On，默认为Off。</p>
<h5 id="fastcgi-logging-On"><a href="#fastcgi-logging-On" class="headerlink" title="fastcgi.logging = On"></a>fastcgi.logging = On</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否记录通过FastCGI进行的连接。</p>
<h4 id="PHP-Core-Weirdy"><a href="#PHP-Core-Weirdy" class="headerlink" title="[PHP-Core-Weirdy]"></a>[PHP-Core-Weirdy]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些选项仅存在于文档中，却不存在于phpinfo()函数的输出中</p>
<h5 id="async-send-Off"><a href="#async-send-Off" class="headerlink" title="async_send = Off"></a>async_send = Off</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是否异步发送。</p>
<h5 id="from-”john-doe-com”"><a href="#from-”john-doe-com”" class="headerlink" title="from =　;”john@doe.com”"></a>from =　;”john@doe.com”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;定义匿名ftp的密码(一个email地址)</p>
<h3 id="近核心模块"><a href="#近核心模块" class="headerlink" title="近核心模块"></a>近核心模块</h3><h4 id="Pcre"><a href="#Pcre" class="headerlink" title="[Pcre]"></a>[Pcre]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Perl兼容正则表达式模块</p>
<h5 id="pcre-backtrack-limit-100000"><a href="#pcre-backtrack-limit-100000" class="headerlink" title="pcre.backtrack_limit = 100000"></a>pcre.backtrack_limit = 100000</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PCRE的最大回溯(backtracking)步数。</p>
<h5 id="pcre-recursion-limit-100000"><a href="#pcre-recursion-limit-100000" class="headerlink" title="pcre.recursion_limit = 100000"></a>pcre.recursion_limit = 100000</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PCRE的最大递归(recursion)深度。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果你将该值设的非常高，将可能耗尽进程的栈空间，导致PHP崩溃。</p>
<h4 id="Session"><a href="#Session" class="headerlink" title="[Session]"></a>[Session]</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除非使用session_register()或$_SESSION注册了一个变量。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;否则不管是否使用了session_start()，都不会自动添加任何session记录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;包括resource变量或有循环引用的对象包含指向自身的引用的对象，不能保存在会话中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;register_globals指令会影响到会话变量的存储和恢复。</p>
<h5 id="session-save-handler-“files”"><a href="#session-save-handler-“files”" class="headerlink" title="session.save_handler = “files”"></a>session.save_handler = “files”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;存储和检索与会话关联的数据的处理器名字。默认为文件(“files”)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想要使用自定义的处理器(如基于数据库的处理器)，可用”user”。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有一个使用PostgreSQL的处理器：<a href="http://sourceforge.net/projects/phpform-ext/" target="_blank" rel="external">http://sourceforge.net/projects/phpform-ext/</a></p>
<h5 id="session-save-path-“-tmp”"><a href="#session-save-path-“-tmp”" class="headerlink" title="session.save_path = “/tmp”"></a>session.save_path = “/tmp”</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;传递给存储处理器的参数。对于files处理器，此值是创建会话数据文件的路径。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Windows下默认为临时文件夹路径。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;你可以使用”N;[MODE;]/path”这样模式定义该路径(N是一个整数)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;N表示使用N层深度的子目录，而不是将所有数据文件都保存在一个目录下。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[MODE;]可选，必须使用8进制数，默认600(=384)，表示每个目录下最多保存的会话文件数量。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是一个提高大量会话性能的好主意。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/8. php.ini 文件配置/">php.ini 文件配置</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;前面已经拷贝了一个 php.ini 文件到 /usr/local/php/etc 目录下面，这是已经知道 php.ini 所在路径在哪里，但有时候并不知道 php.ini 所在路径，这时候就需要命令来查一查在哪里</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># /usr/local/php/bin/php -i |head</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看那一行 Loaded Configuration File =&gt; /usr/local/php/etc/php.ini 。如果这里为 None ，那么就说明没有加载到具体的 php.ini 。找到 php.ini 后，名 vim 打开它，发现很多行都是以 ； 开头的，这个符号在 php.ini 中作为注释符号，也就是说只要是以 ； 开头的行都是不起作用的。而php.ini 中常用的配置有如下：</p>
<h2 id="1-配置-disable-function"><a href="#1-配置-disable-function" class="headerlink" title="1.配置 disable_function"></a>1.配置 disable_function</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认是没有配置的</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php.ini%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明，在 php 中有非常多的函数，在这些函数中有一些是不太安全的，所以有必要把它们禁掉。像 exec ，shell_exec 都是在 php 代码中执行 linux shell 命令，很危险，要禁掉。</p>
<h2 id="2-配置-error-log"><a href="#2-配置-error-log" class="headerlink" title="2.配置 error_log"></a>2.配置 error_log</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果是 php 开发人员，那会经常遇到调试代码的情况，作为一个运维人员理应学会简单的 php 错误排查技能，其实 php 的错误跟 linux 下其他服务都是一样的，遇到错误后要查看错误日志，根据报错信息来判断错误的原因。那如何查看 php 的错误信息？遇到错误时，访问网站通常会显示白页，什么都没有，状态码是500.第一种情况，可以直接把错误信息显示在浏览器中，配置方法是在 php.ini 中找到 display_errors = on 。重启 apache 服务后，刷新页面，发现不再是白页，而是具体的错误。这样就可以根据错误来调试 php 代码了。这种情况适合临时调试，但是这种情况不适合长期配置，因为所有错误都会显示在浏览器上，假如哪天 php 程序员不小心写错一段代码，而且没有测试直接上传到服务器上了，那么用户就会直接看到这些错误，这样是不合适的。所以还有第二种情况，把错误信息输出到一个日志文件中，具体配置如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/php/etc/php.ini</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入或更改</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">display_error=off</div><div class="line">log_errors=on</div><div class="line">error_log=/usr/<span class="built_in">local</span>/php/logs/php_errors.log</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：该文件一开始是不存在的，为了避免权限问题不能自动生成该文件，我们可以先创建该文件，并且修改权限为777</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># mkdir /usr/local/php/logs</span></div><div class="line">[root@lamp ~]<span class="comment"># chmod 777 /usr/local/php/logs</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">error_reporting = E_ALL &amp; ~E_NOTICE</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：首先要把错误不再浏览器显示，第二打开错误日志开关，然后指定错误日志的了路径，最后是定义错误日志的级别。配置完成后要重启 apache 服务，才会生效。</p>
<h2 id="3-配置-open-basedir"><a href="#3-配置-open-basedir" class="headerlink" title="3.配置 open_basedir"></a>3.配置 open_basedir</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 php 中是有这个 open_basedir 概念的，它的意思是，把执行 php 的用户限定在指定的路径下，这样通过权限缩小的方式达到安全目的。作为一个网站，其实只需要让 php 用户访问到网站的代码即可，没有必要让它去访问其他目录。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/php/etc/php.ini</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入或更改</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">open_basedir = /data/www:/tmp</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：/data/www 和 /tmp 是允许 php 可以访问的两个目录，同样也可以是多个，目录之间用 ： 分隔。一旦限定后，如果 php 试图去访问除  /data/www 和 /tmp 外的目录下的文件时，就会报错。错误类似于，Warning: file_exists() [function.file-exists]: open_basedir restriction in effect . File(../123.php) is not within the allowed path(s):</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了在 php.ini 中定义 open_basedir 外，其实还可以在 apache 的配置文件中定义，因为一个 apache 下可能有多个站点，针对不同的站点限定不同的 open_basedir 。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/apache2/conf/httpd.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;或者虚拟主机配置文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/apache2/conf/extra/httpd-vhosts.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">php_admin_value open_basedir <span class="string">"/data/www/:/tmp/"</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php.ini%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/02.png?raw=true" alt=""></figure></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/7. 常见apache php_admin_value php_admin_flag 设置/">常见apache php_admin_value php_admin_flag 设置</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">php_admin_value open_basedir /data/123:/tmp/</div><div class="line">php_admin_flag engine on</div><div class="line">php_admin_flag log_errors on</div><div class="line">php_admin_value max_execution_time 180</div><div class="line">php_admin_value upload_tmp_dir /mp/</div><div class="line">php_admin_value include_path /data/123/include</div><div class="line">php_admin_flag short_open_tag on</div><div class="line">php_admin_value memory_limit 8388608</div><div class="line">php_admin_value error_reporting 15</div><div class="line">php_admin_flag display_errors on</div><div class="line">php_admin_flag track_errors off</div><div class="line">php_admin_value error_log /home/logs/php_error.log</div><div class="line">php_admin_flag magic_quotes_gpc on</div><div class="line">php_admin_flag track_vars on</div><div class="line">php_admin_value auto_prepend_file /data/123/php/prepend.php</div><div class="line">php_admin_value auto_append_file /data/123/php/append.php</div></pre></td></tr></table></figure>
<h2 id="php-admin-value-php-admin-flag-php-value-php-flag"><a href="#php-admin-value-php-admin-flag-php-value-php-flag" class="headerlink" title="php_admin_value php_admin_flag php_value php_flag"></a>php_admin_value php_admin_flag php_value php_flag</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;前面的两个参数用在httpd.conf 中，后面的两个用在.htaccess中</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;至于 value  和 flag 的不同在于，前者用于设置值（如字符串）， 后后者只能是on off</p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/21">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
